将此查询的结果输出为文本。不要忘记更改变量的值!获取结果并运行它。
SET NOCOUNT ON
DECLARE @ColumnName VARCHAR(200) = 'ReplaceColumn'
, @ReplaceIdStr VARCHAR(200) = 'ExampleReplaceIdStr'
, @FindIdStr VARCHAR(200) = 'ExampleFindIdStr'
PRINT 'BEGIN TRAN'
PRINT 'SET XACT_ABORT ON'
SELECT
'UPDATE ' + C.TABLE_NAME + CHAR(13)
+ 'SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ', ''' + @ReplaceIdStr + ''', ''' + @FindIdStr + ''')' + CHAR(13)
+ 'WHERE ' + @ColumnName + ' LIKE ''%' + @ReplaceIdStr + '%'' AND PROJID = ''1000''' + CHAR(13)
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.COLUMN_NAME = 'PROJID'
PRINT 'COMMIT TRAN'
SET NOCOUNT OFF
编辑:另外,一些推理:您说您要更新所有包含名为PROJID
. 您的第一个查询只是说如果表@TableName
有PROJID
列,则@ColumnName
对其进行更新。但它不能保证上面有@ColumnName。我给出的查询也没有检查,因为我假设所有表PROJID
也有@ColumnName
. 如果不是这种情况,请告诉我,我可以更新答案以进行检查。您收到Invalid Column Name
错误表明@ColumnName
不存在。
您的查询最多会更新一个表 ( @TableName
),而我给您的查询将更新每个具有PROJID
. 我希望这就是你的目标。
编辑2:这是一个可以一次运行的版本:
DECLARE @ColumnName VARCHAR(200) = 'Value'
, @ReplaceIdStr VARCHAR(200) = 'ExampleReplaceIdStr'
, @FindIdStr VARCHAR(200) = 'ExampleFindIdStr'
DECLARE @Sql NVARCHAR(MAX)
DECLARE UpdateCursor CURSOR FOR
SELECT
'UPDATE ' + C.TABLE_NAME
+ ' SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ', ''' + @ReplaceIdStr + ''', ''' + @FindIdStr + ''')'
+ ' WHERE ' + @ColumnName + ' LIKE ''%' + @ReplaceIdStr + '%'' AND PROJID = ''1000'''
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.COLUMN_NAME = 'PROJID'
OPEN UpdateCursor
FETCH NEXT FROM UpdateCursor
INTO @Sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @Sql
FETCH NEXT FROM UpdateCursor
INTO @Sql
END
CLOSE UpdateCursor
DEALLOCATE UpdateCursor