このクエリの結果をテキストに出力します。変数の値を変更することを忘れないでください! この結果を取得して実行します。
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
最大で 1 つのテーブル ( ) を更新しますが、私が提供したものは を持つすべてのテーブルを更新します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