【发布时间】:2019-03-22 15:48:21
【问题描述】:
有没有办法根据动态值创建表数组(或动态创建的表)?例如,我知道在 C++ 中可以使用指针和动态内存,但我需要在 SQL 中执行类似的操作。
用户指定他们希望查看每年 X 年的数据,我们需要查看可以构建到临时表中的 15+ 列(每年都相同)。
用户选择5 年份的数据和当前年份为2018,所以我想为2018, 2017, 2016, 2015 and 2014. 动态创建一个本地表。每个表都将跟踪客户数据、销售等。每个表都一样。
如果上述情况不可行,我们是否可以限制用户仅选择年份并动态始终坚持 5 年。用户指定他们想以2017 开头,我们默认为他们构建2017, 2016 ... 2013.
我可以继续说创建表#year1, #year2, #year3 etc. 但这需要大量编码(主要是提前复制和粘贴)。有没有办法避免这种情况——比如创建表#years[] 或指针?然后动态构建某种#years 表数组。
我们最终要做的是通过完全相同的查询/逻辑逐年提取完全相同的数据集。然后最后比较谁/属于哪一年以及如何。底线是避免复制和粘贴相同的声明/选择/插入语句 5 次或更多次? (并且尽可能避免光标/循环)
我尝试编写类似这样的代码
DECLARE @season_counter int = 5
DECLARE @cnt int = 0
Declare @cnt_v varchar(1) = CONVERT(varchar(10), @cnt)
DECLARE @SQL NVARCHAR(max) = ''
WHILE @cnt <= @season_counter
BEGIN
select @SQL = @SQL + ' create table #year' + @cnt_v
+ ' (customer_no int, order_no int, perf_no int, due_amt money, paid_amt money, status int ) '
exec sp_executesql @SQL
print @SQL
set @cnt = @cnt + 1
set @cnt_v = CONVERT(varchar(10), @cnt)
set @sql = ''
END
select * from #year1
select * from #year2
以上产生的错误
Msg 208, Level 16, State 0, Line 81
Invalid object name '#year1'.
我不能使用全局变量,而且我肯定不想为 20 个表声明 Create 语句(作为某个最大值)。我希望它是动态的和动态的。请指教。
【问题讨论】:
-
听起来你需要一个立方体.....
-
@MitchWheat 这对于立方体来说太小了(无论如何对我们来说)。
标签: arrays sql-server dynamic dynamic-memory-allocation sp-executesql