循环遍历表中的列名并执行一组操作 - SQL Server 2008

时间:2014-05-05 20:24:42

标签: sql sql-server-2008 cursor

感谢您帮助我度过了以前的潮流。我目前正在为我的一个项目开发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,都不应该成为问题。一个..

1 个答案:

答案 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)的原因)。请详细描述您的行为,也许某处有错误。