2017-11-16 3 views
0

次のSQLクエリを理解する必要があります。誰かが詳細に(xmlパスのように)もう少し詳しく説明できるかどうかを尋ねたいと思います置き換え要素で? だから私はすべての値をBlaBlaBlaBlaで見つけて、代わりにHaHaHaHaで置き換えたいと思っています。現時点では、クエリはBlaBlaBlaBlaのすべての値のみを検索しています。sql-query、この特定のコードを検索して置き換えます

DECLARE @searchstring NVARCHAR(255) 
SET @searchstring = '%BlaBlaBlaBla%' 

DECLARE @sql NVARCHAR(max) 

SELECT @sql = STUFF((
    SELECT 
    ' UNION ALL SELECT ''' + TABLE_SCHEMA + '.' + TABLE_NAME + ''' AS tbl, ''' + COLUMN_NAME + ''' AS col, [' + COLUMN_NAME + '] AS val' + 
    ' FROM [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] WHERE [' + COLUMN_NAME + '] LIKE ''' + @searchstring + '''' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE DATA_TYPE in ('nvarchar', 'varchar', 'char', 'ntext') FOR XML PATH('')) ,1, 11, '') 

Exec (@sql) 

答えて

0

XML PATHは、すべての文字列を連結するためのトリックだと思います。

あなたはこのようなものでREPLACEにそれを変更することができます:

SELECT @sql = 
SELECT 
    ' UPDATE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' 
     SET ' + QUOTENAME(COLUMN_NAME) + ' = REPLACE(' + QUOTENAME(COLUMN_NAME) + ', ''' + @search_string + ''', ' + ', ''' + @replace_string + ''' 
     WHERE ' + QUOTENAME(COLUMN_NAME) + ' LIKE ''' + @searchstring + '''' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE 
    DATA_TYPE in ('nvarchar', 'varchar', 'char', 'ntext') FOR XML PATH('') 

EXEC(@sql) 

いくつかの注意点:

私はこれをテストしていません。このようなコードを生成しているときは、開始と終了の引用符で軽度のエラーを作成するのは非常に簡単です。SQLを出力して確認し、出力SQLが正しくなるまで繰り返す必要があります。

また、これは一般的には良い考えではありません。データベースが大規模でテーブル数が多い場合は、パフォーマンスが低下する可能性があります。通常、この種のデータがどこに現れるかを分析し、必要に応じて修正するコードを記述する必要があります。あなたのデータを通して文字列にデータ要素が埋められているという事実が関係しています。

最後に、更新したくない追加データが簡単に更新される可能性があることに注意してください。 "123"を "456"に更新しようとすると "My ID is 1234"という文字列があります。 "My ID is 4564"になります。

ところで、QUOTENAME機能は[]にあなたのテーブル名とカラム名を囲むの方法ですが、引用符文字は、DBの実装に変更された場合、それはまだ動作するはずです。

+0

ご協力いただきありがとうございます。 選択したすべてのテーブルのすべての値が選択されていますか?どこでもこの価値を見いだし、それを何か他のものに置き換えると言う簡単な方法はありますか? 多分私がしたいのは、どこにでも値を置き換えるだけなら、XMLパスは過剰です。 "最後に、更新したくない追加データを簡単に更新する可能性があることに注意してください。" 123 "を" 456 "に更新しようとすると、" My ID is 1234 "は「My ID is 4564」となる予定です。 - これは私が欲しいものです。 – Johan

+0

'EXEC(@sql)'を 'SELECT @ sql'に置き換えて、どのようにコードが動作するかを知るために返すものを見てください。データベース内のすべての文字列を取得し、それぞれの文字列を検索して置き換えるための更新を生成しています。私の頭の上からちょうど離れて、非常に非効率になるだろう。なぜなら、テーブルに3つの文字列があると、3つの更新ステートメントが実行され、それらのすべてが完全なテーブルスキャンを行わなければならないからです。 –

関連する問題