2

私はSQLServerスクリプト(通常はC ++開発者)に不慣れであり、少しの支援を本当にいただければ幸いです。

'PROJID'列を含むSQLServerデータベース内のすべてのテーブルで「検索と置換」の更新を実行しようとしています。私はこれを行う方法を見つけるのに本当に苦労していますが、それは私に報告されません:

メッセージ207、レベル16、状態1、行1無効な列名'PROJID'。

私が実行しているステートメントは次のとおりです。

EXEC
(
  'IF EXISTS(SELECT * FROM sys.columns WHERE name = N''PROJID'' AND Object_ID = Object_ID(N''' + @TableName + '''))' +
  ' BEGIN' +
  ' UPDATE ' + @TableName + 
  ' SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ',''' + @ReplaceIDStr + ''',''' + @FindIDStr + ''')' +
  ' WHERE ' + @ColumnName + ' LIKE ''' + @ReplaceIDStr + '''' + ' AND PROJID = ''1000''' +
  ' END'
)

私も使用してみました:

'IF COL_LENGTH(''' + @TableName + ''',''PROJID'') IS NOT NULL' +

上記の列存在チェックの代わりに。これでも、「無効な列名」メッセージが表示されます。

'Exec'ステートメントの外でcolumn-existチェックを実行できれば幸いですが、これを実行する方法もわかりません。

4

2 に答える 2

2

別のスコープでそれを行う必要があるだけです。

IF EXISTS (SELECT 1 FROM sys.columns ...)
BEGIN
  DECLARE @sql NVARCHAR(MAX);
  SET @sql = N'UPDATE ...';
  EXEC sp_executesql @sql;
END
于 2012-09-04T17:01:24.060 に答える
1

このクエリの結果をテキストに出力します。変数の値を変更することを忘れないでください! この結果を取得して実行します。

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。最初のクエリは、テーブル@TableNamePROJID列がある場合はそれを更新@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
于 2012-09-04T17:22:49.783 に答える