更新声明的表格动态列名称

时间:2018-01-12 13:04:14

标签: sql-server tsql

我正在运行一个SQL循环来更新声明的表。请看下面的

DECLARE @tblResults TABLE (  [idx]              INT IDENTITY(0,1)
                            ,[cityCode]         VARCHAR(3)
                            ,[month_1_perc]     INT
                            ,[month_2_perc]     INT
                            ,[month_3_perc]     INT
                            ,[month_4_perc]     INT
                            ,[month_5_perc]     INT
                            ,[month_6_perc]     INT
                            ,[month_7_perc]     INT
                            ,[month_8_perc]     INT
                            ,[month_9_perc]     INT
                            ,[month_10_perc]    INT
                            ,[month_11_perc]    INT
                            ,[month_12_perc]    INT)
  

循环将从这里开始

DECLARE @colName VARCHAR(15)
DECLARE @sqlExec VARCHAR(500) = CONACT('UPDATE @tblResults SET [month_', @colName, '_perc] = 9; 

EXECUTE(@sql)
  

这显然不起作用 - 我试图找到一个工作,如果有的话 - 接受建议

2 个答案:

答案 0 :(得分:0)

DECLARE @colName VARCHAR(15)
DECLARE @sqlExec VARCHAR(500)

SET @colName = '1'
SET @sqlExec = 'UPDATE @tblResults SET [month_' + @colName + '_perc] = 9' 

EXECUTE( @sqlExec)

答案 1 :(得分:0)

我对你的请求有点困惑,但如果你真的想使用循环

declare @i int = 1;
declare @sqlUpdate nvarchar(max) = 'UPDATE tblResults SET ';
declare @sql;

while @i <= 12 
BEGIN

set @sql = @sqlUpdate + '[month_' + cast(@i as nvarchar(5)) + '_perc] = 9;' -- value?

print (@sql)
-- execute (@sql)

set @i = @i + 1;
END

或者您想一次性为所有列设置相同的值

declare @cols nvarchar(max)
select @cols = STUFF((SELECT ',' + QUOTENAME(col.name) + ' = 9' -- value?
                      from tempdb.sys.columns col
                        join tempdb.sys.tables tab on col.object_id = tab.object_id
                        where tempdb.tab.name = 'tblResults'
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')  


declare @sql nvarchar(max) = 'UPDATE tblResults SET ' + @cols;

print (@sql)
-- execute (@sql)

注意,没有测试任何脚本