【问题标题】:T-SQL openquery doesn't update on NULL valueT-SQL openquery 不会更新 NULL 值
【发布时间】:2016-05-27 19:02:13
【问题描述】:

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

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

【问题讨论】:

  • 为什么要标记 MySQL?
  • 忘了说我使用 openquery 与 MySql 数据库交互
  • 您正在通过 SQL Server 连接到 MySQL?这听起来像是麻烦的秘诀。 NULL 值不是字符串。他们需要以不同的方式进行转义。
  • 是的,通过链接服务器对象
  • 在使用空值运行 @TSQL 之前输出它。然后验证语法。我的猜测是你有一个语法错误,不知何故没有被报告。像... set parent_ID = 'NULL', user_ID = 'Null', item_ID = 'NULL' 但其中一列可能是数字?并且隐式转换失败了?

标签: sql-server tsql triggers openquery


【解决方案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)

【讨论】:

  • 请解释一下。我使用整数字段(如我假设的 parent_id )进行了测试,使用基本相同的语法,将 VARCHAR 变量传递给 EXEC 并且它起作用了。也许我忽略了一些东西。
  • 您的想法非常有效,我只是使用COALESCE 使字符串为空,但我只是从未想过将NULL 放在字符串中,因此使用COALESCE(@var, 'NULL') 使一切正常,谢谢
  • @TimLaVenice 对不起,我与WHERE 子句混淆了
  • 没问题@Arulkumar!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2022-07-27
相关资源
最近更新 更多