循环查询和更新字段

Loop through Query and Update field

我正在尝试将查询中定义的字段循环到更新语句。

我有以下 SQL:

Declare @SQL varchar(max)

@SQL= 'Select [a],[b],[c],[d],[e]....[z]
       From Table1;' 

我希望能够遍历所有字段 [a]-[z] 并通过以下语句进行更新:

Update Table 1 
Set [a] = Case when [a] = 'Not at all' Then 0
               when [a] = 'Very Much' Then 10 End 

字段名实际上不是[a]..[z];我不能 运行 整个 table 的更新语句,只有一组特定的字段名称。

努力在 SQL 服务器中以编程方式编写它。

Declare @SQL varchar(max) 
Declare @name varchar(100)
DECLARE @getid CURSOR

Set @getid = cursor for 
SELECT name 
FROM 
sys.dm_exec_describe_first_result_set('Select [a],[b],[c],[d],[e]....[z]
   From Table1', NULL, 0)

Open @getid 
FETCH NEXT
FROM @getid INTO  @name
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'Update Table1
        Set ' + @name + ' = Case when ' + @name +'= ''Very Much'' Then ''10''
        when ' +  @name + ' = ''Not at all'' Then ''0''
        Else ' + @name + ' End'

    Exec(@SQL)          
    FETCH NEXT
    FROM @getid INTO @name
END

CLOSE @getid
DEALLOCATE @getid

基本上 dm_exec_describe_first_result_set 是抓取字段名并将其输出为记录集。然后我们只是将每条记录传递给 @name 并使用它形成我们的更新语句,然后为传递的每条记录执行它。

希望这对其他人有帮助!想看看有没有更好的方法。

我想如果你想让它更通用一点,我会做类似下面的代码。这将使您不必为每个要执行此操作的 table 编写特定查询,并且您可能会在将来过滤掉不需要的列。

明确地说,我从@Dale-K post 那里借用了 SQL 来进行实际的更新,并使其变得漂亮。

DECLARE @strSQL NVARCHAR(1000)
DECLARE @strTable NVARCHAR(100)
DECLARE @strColName VARCHAR(100)


SET @strTable = N'Table1'

CREATE TABLE #COLUMNS(ColName varchar(100))

SET @strSQL = ' select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = @TableName  and DATA_TYPE in (''nvarchar'', ''varchar'')'


INSERT INTO #COLUMNS
EXEC sp_executeSQL @strSQL, N'@TableName nvarchar(100)', @TableName = @strTable


DECLARE  csrColumns  CURSOR LOCAL FORWARD_ONLY FOR
SELECT ColName FROM #COLUMNS

OPEN csrColumns
FETCH csrColumns INTO @strColName


WHILE @@FETCH_STATUS = 0
BEGIN

   SET @strSQL = N'UPDATE ' + @strTable + '
        SET ' + @strColName + ' = CASE WHEN ' + @strColName +'= ''Very Much'' THEN ''10''
        WHEN ' +  @strColName + ' = ''Not at all'' THEN ''0''
        ELSE ' + @strColName + ' END'

    exec sp_ExecuteSQL @strSQL

    FETCH csrColumns INTO @strColName

END

CLOSE csrColumns
DEALLOCATE csrColumns