循环查询和更新字段
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
我正在尝试将查询中定义的字段循环到更新语句。
我有以下 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