【问题标题】:Create variables based on condition in SQL?在 SQL 中根据条件创建变量?
【发布时间】:2019-05-15 05:08:19
【问题描述】:

你能在 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,因为我已经问过 here 我如何获取数据,我现在的任务是让它动态化,特别是自从我们有 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`

【问题讨论】:

  • 你最多有 10 个变量?或者可能更多?
  • @mkRabbani 可以更多,也可以更少......
  • 知道了。你会用那个变量做进一步的动作吗?或者你只需​​要 2014 2015 的输出?
  • 你想做什么?拆分字符串?有一些技术可以解决几个重复的问题。由于 SQL 处理集合,因此您将返回一个 set
  • @Mr.J 不要使用 CSV 作为参数。使用表值参数。完整的查询虽然显示了一些严重的设计问题,例如每年单独的表。这是一个非常的坏主意。一方面,它们根本没有提高性能。其次,SQL Server 已经支持transparent partitioning,但除非每个表有数 GB 的数据,否则您不需要它。分区是一种数据管理功能,对性能没有帮助

标签: sql tsql sql-server-2008


【解决方案1】:

据我所知,不可能以这种方式动态生成变量,除非您完全动态地创建 SQL 逻辑并使用EXECUTEsp_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 值后附加一个额外的逗号...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多