感谢您帮助我度过了以前的潮流。我目前正在为我的一个项目开发SQL Server 2008,其中一部分需要使用22列进行一系列类似的操作。
列名仅因数字而异,例如
C1_1,C1_2,c1_3
有没有办法循环列名?我尝试了以下代码,但它抛出了一个错误
DECLARE @i INT
SET @i=2
while (@i<=22)
begin
SELECT [DEF].[CONCATENATE], SUM(DEF.[C1_+@i+_PREV]) as
[C1_@i_prev]
INTO #TMP_C1_@i_CONCATENATE_PREV
FROM DEF
GROUP BY DEF.[CONCATENATE]
SELECT [ABC].[CONCATENATE], SUM(ABC.[C1_@i_CURR]) as
[c1_@i_curr]
INTO #TMP_C1_@i_CONCATENATE_CURR
FROM ABC
GROUP BY ABC.[CONCATENATE]
UPDATE #tmp_var_concatenate_c1_@i
SET [Amount] = #TMP_C1_@i_CONCATENATE_PREV.[C1_@i_PREV]
FROM #tmp_var_concatenate_c1_@i
INNER JOIN
#TMP_C1_@i_CONCATENATE_PREV ON
#tmp_var_concatenate_c1_@i.[CONCATENATE] = #TMP_C1_@i_CONCATENATE_PREV.
[CONCATENATE]
如果我做的是愚蠢的话,请原谅我的无知。
由于
这是代码打嗝的代码的一部分。
alter table #tmp_var_concatenate_C1_'+cast(@i as varchar)+'
add [ColA] varchar(255),
[ColB] Varchar(255),
[ColC] Varchar(255),
[ColD] VARCHAR(50),
[ColE] MONEY,
[ColF] MONEY
是因为我使用的#tables吗?但是,理想情况下,无论是使用Temp表还是reg,都不应该成为问题。一个..
答案 0 :(得分:1)
您可以使用动态sql:
DECLARE @SQL varchar(max), @i INT
SET @i=2
while (@i<=22)
begin
/* Then cover all calculations with this one: */
SET @SQL='SELECT [DEF].[CONCATENATE], SUM(DEF.[C1_'+cast(@i as varchar)+'_PREV]) as
[C1_'+cast(@i as varchar)+'_prev]
INTO #TMP_C1_'+cast(@i as varchar)+'_CONCATENATE_PREV
FROM DEF
GROUP BY DEF.[CONCATENATE]
/* and all your code with the same trick in @i to the END */
'
--PRINT (@SQL) -- print it before use to see the result script
EXEC (@SQL)
/* Than do your iterations etc. */
set @i+=1
end
别忘了替换所有&#39;在@SQL中使用&#39;&#39;。 你还需要在@SQL内部使用临时表进行所有操作,如果你想在动态sql之外进行最终更新,只需使表真实,然后删除它们。
<强> [UPDATE] 强> 至于你遇到改变临时表的问题,我试图重现这个错误,但没有任何反应,一切正常。请使用此代码作为示例。
declare @sql varchar(max),@i int
set @i=2
while @i<=22
begin
set @sql='
select ID,Code into #TMP_C1_'+cast(@i as varchar)+'_CONCATENATE_PREV from (select 0 as ID, ''a'' as Code) t1
alter table #TMP_C1_'+cast(@i as varchar)+'_CONCATENATE_PREV add [Col1] varchar(255), [Col2] Varchar(255), [Col3] Money
select * from #TMP_C1_'+cast(@i as varchar)+'_CONCATENATE_PREV'
--print (@sql)
exec (@sql)
set @i+=1
end
首先,我使用动态名称创建临时表。其次,添加新列。最后一次验证是成功的。你是否在同一个@sql-batch中执行了所有创建/修改?如果不是,这不会起作用,因为这些表只能在这个批次中使用(这就是我们在声明时使用varchar(max)的原因)。请详细描述您的行为,也许某处有错误。