我有一个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,因此我不确定为什么我无法更新数据库。
任何帮助都会很好,谢谢!
答案 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)