2016-05-27 26 views
-1

ローカルデータベースが更新されたときにリモートデータベースを新しい値で更新するMicrosoft SQL Serverトリガーがあります。すべて正常に動作し、私はスクリプトをテストし、null値がない限り、正常に更新されます。NULL値でT-SQL OpenQueryが更新されない

コードは以下の通りです:すべてのフィールドに値を持っていますが、一つの列がnullの場合、そのクエリは、すべての行を更新しません、エラーがスローされなかった場合

DECLARE @TSQL nvarchar(4000); 
SELECT @TSQL = 
    'UPDATE 
     OPENQUERY(TEST,''SELECT * FROM test_db WHERE id = ' + convert(VARCHAR(MAX), @id) +''') 
    SET 
     parent_id = ' + convert(VARCHAR(MAX), @parent_id) + ', user_id = ' + convert(VARCHAR(MAX), @user_id) + ', item_id = ' + convert(VARCHAR(MAX), @item_id) + '' 
EXEC (@TSQL) 

すべてがうまく動作します。私はCOALESCE()を空の文字列にnull変数を変更するために使用しようとし、その後、行を更新しますが、すべてのnull列は0になり、私はそれらをNULL値としてとどまりたいです。両方のデータベースのすべての列はnull値を許可し、デフォルトはnullなので、なぜデータベースを更新できないのか分かりません。

いいえ、ありがとう!

+0

このタグが付けられたのはなぜですか? – tadman

+0

私はオープンクエリを使用してMySqlデータベースと対話していました –

+0

あなたは* * SQL Serverを介してMySQLに接続していますか?これはトラブルのレシピのように聞こえる。 'NULL'値は文字列ではありません。彼らは異なった逃げ道が必要です。 – tadman

答えて

1

これを試してください。 ISNULLを使用し、値がNULLの場合は、シングルクォートで 'NULL'を使用します。文字列が連結されると、引用符は保持されないので、NULL値に設定され、 'NULL'の文字列には設定されません。

DECLARE @TSQL nvarchar(4000); 
SELECT @TSQL = 
    'UPDATE 
     OPENQUERY(TEST,''SELECT * FROM test_db WHERE id = ' + convert(VARCHAR(MAX), @id) +''') 
    SET 
     parent_id = ' + ISNULL(convert(VARCHAR(MAX), @parent_id), 'NULL') + ', 
     user_id = ' + ISNULL(convert(VARCHAR(MAX), @user_id), 'NULL') + ', 
     item_id = ' + ISNULL(convert(VARCHAR(MAX), @item_id), 'NULL') + '' 
EXEC (@TSQL) 
+0

説明してください。 VARCHAR変数をEXECに渡して、基本的に同じ構文を使用して、整数フィールド(例:parent_idは想定しています)を使用してテストを行いました。たぶん私は何かを見落としているでしょう。 – TLaV

+0

あなたのアイデアは完璧に働いていましたが、文字列を空にするために 'COALESCE'を使っていましたが、' COLESCE(@var、 'NULL') 'を使って文字列の中に' NULL ' 、thanks –

+0

@TimLaVenice申し訳ありませんが、私は 'WHERE'節と混同しています。 – Arulkumar

関連する問題