2016-05-27 64 views
-1

我有一個Microsoft SQL Server觸發器,用於在更新本地數據庫時使用新值更新遠程數據庫。一切工作正常,我測試了腳本,它的更新很好,除非有一個空值。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()將空變量更改爲空字符串,然後它將更新該行,但所有空列變爲0,我希望它們保留爲NULL值。兩個數據庫中的所有列都允許空值,默認爲空,所以我不知道爲什麼我無法更新數據庫。

任何幫助將不錯,謝謝!

+0

爲什麼這個標記爲MySQL? – tadman

+0

忘了提及我正在使用openquery與MySql數據庫進行交互 –

+0

您正在通過* SQL Server連接到MySQL *這聽起來像是一個麻煩的祕訣。 NULL值不是字符串。他們需要以不同的方式逃脫。 – tadman

回答

1

試試這個。使用ISNULL,如果值爲空,則在單引號中使用「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

請解釋。我使用基本相同的語法,使用整數字段(如parent_id,我假設)做了一個測試,將一個VARCHAR變量傳遞給EXEC並且它工作。也許我忽略了一些東西。 – TLaV

+0

你的想法是完美的,我只是使用'COALESCE'來使字符串爲空,但是我只是永遠不會把'NULL'放在字符串中,所以使用COALESCE(@var,'NULL')'使所有的東西都起作用,謝謝 –

+0

@TimLaVenice對不起,我混淆了WHERE條款 – Arulkumar