【发布时间】: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