首页 > 解决方案 > 在 SQL 中根据条件创建变量?

问题描述

您可以根据 SQL Server 中的条件创建变量吗?

例如,我将传递一个字符串,例如'2016,2017'

我的查询将创建 2 个变量,因为它有 2 年

现在,如果我在字符串中过了 10 年,例如'2010,2011,...'

我的查询也必须创建 10 个变量...

这甚至可能吗?

编辑:

伪码

declare @string as nvarchar(max) = '2014,2015,2016'
declare @count as int = (select LEN(REPLACE(@string, ',', '**')) - LEN(@string) )


while @count <> 0
begin

--create variable statement here
Declare @var + @count as nvarchar(max)

set @string = (select substring(@string,0,CHARINDEX(',', @string)))

set @var +@count = @string

set @count = count - 1


end


select @var1, @var2

输出

2014 2015

编辑 2

原因:

我想要一个 SP 来输出查询的销售数据,因为我已经在这里询问了如何获取数据,我现在的任务是使其动态化,特别是自从我们保留 15 年以来的那些年。查询的数据可能从 1 年到 15 年

我的第一个想法是把岁月当作一根绳子

exec SP_test '2014,2015,2016'

这让我想到创建动态变量,以便我可以替换查询中的年份,以及创建查询所需的字符串以产生适当的结果

完整的伪代码

declare @string as nvarchar(max) = '2014,2015,2016'
declare @count as int = (select LEN(REPLACE(@string, ',', '**')) - LEN(@string) )


while @count <> 0
begin

--create variable statement here
Declare @var + @count as nvarchar(max)

set @string = (select substring(@string,0,CHARINDEX(',', @string)))

set @var +@count = @string

set @count = count - 1


end

--up to this point lets say I have created @var1 and @var2

 SELECT Item,Price,Quantity,PriceYear,QuantityYear INTO TempFinal
    FROM (
    SELECT Item,Price,Quantity, 'Price+@var1' as PriceYear,'Quantity+@var1' as QuantityYear FROM @Table+@var1
    UNION ALL                                      
    SELECT Item,Price,Quantity, 'Price@var2' as PriceYear,'Quantity@var2' as QuantityYear FROM @Table+@var2
    ) MyTables

这只是一个示例,但查询应该构建字符串。该示例有 2 年,因此查询创建了两个 select 语句(这是另一个问题,但我想我可能有一个解决方案)然后是涉及年份的唯一字段。

  SELECT item, SUM([Price+@var1])[Price+@var1],SUM([Quantity+@var1])[Quantity+@var1],SUM([Price+@var2])[Price+@var2],SUM([Quantity+@var2])[Quantity+@var2]
    FROM (
    SELECT item,Price,Quantity,PriceYear,QuantityYear
    FROM TempFinal) up
    PIVOT (SUM(Quantity) FOR QuantityYear IN ([Quantity+@var2],[Quantity+@var2]) AS pvt
    PIVOT (SUM(Price) FOR PriceYear IN ([Price+@var1],[Price+@var2]) AS pvt2
    GROUP by item
    ORDER BY item

   --do take note that @var1 contains `2014` and @var2 contains `2015`

标签: sqltsqlsql-server-2008

解决方案


据我所知,不可能以这种方式动态生成变量,除非您完全动态地创建 SQL 逻辑并使用EXECUTEor执行它sp_executesql

您可以考虑改用临时表或表变量。然后该表将用作一种数组。

declare @string as nvarchar(max) = '2010,2011,2012,2013,2014,2015,2016';

declare @vars as table ([index] int identity, [value] nvarchar(max));
declare @charindex as int = CHARINDEX(',', @string);
declare @value as nvarchar(max);

while @charindex > 0
begin
    set @value = substring(@string, 0, @charindex);
    set @string = substring(@string, @charindex + 1, LEN(@string));

    insert into @vars ([value]) values (@value);

    set @charindex = CHARINDEX(',', @string);
end;

select [index], [value] from @vars order by [index];

很抱歉稍微调整你的代码。我想发布一个工作示例(给出您的预期输出)。

额外说明:

如果您还想包含最后一个值,您可能必须在代码中添加更复杂的逻辑......或者您可能只是在@string值后面附加一个额外的逗号......


推荐阅读