T-SQL openquery不会对NULL值进行更新

时间:2016-05-27 19:02:13

标签: sql-server tsql triggers openquery

我有一个Microsoft SQL Server触发器,在更新本地数据库时使用新值更新远程数据库。一切正常,我测试了脚本,它更新正常,除非有一个空值。

代码如下:

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值。两个数据库中的所有列都允许空值,并且默认为null,因此我不确定为什么我无法更新数据库。

任何帮助都会很好,谢谢!

1 个答案:

答案 0 :(得分: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)