当列为null时,SQL Update不会写入第二个数据库

时间:2013-04-16 07:59:08

标签: sql-server tsql

我有一个查询,我用它来在新数据库中为正确的广告获取正确的类别,但是一些受影响的行可能有多个类别,而有些可能没有,研究给了我使用'的信息' table.column + your_data',似乎这带来了副作用,因为它不会更新NULL列,即使它表示正确的行数已经生效..

SQL:

MERGE INTO sites.dbo.ads
USING (
        SELECT e.name
        FROM Database1.dbo.education AS e
        INNER JOIN releducationcategory AS re ON e.educationid = re.educationid
        INNER JOIN category AS c ON re.categoryid = c.categoryid
        INNER JOIN string AS s ON c.categoryid = s.identifier
        WHERE (s.string = 'Biologi, Fysikk & Kjemi') AND (e.site = 'sd')
     ) AS source
  ON Database2.dbo.ads.name COLLATE Finnish_Swedish_CI_AS = source.name COLLATE Finnish_Swedish_CI_AS
  WHEN MATCHED THEN
  UPDATE 
       SET sites.dbo.ads.category = ', biologi-fysikk-kjemi';

当列为NULL时,该更新运行正常,但是当已经有值时,它只会覆盖..当我将其更改为下面时:

SET sites.dbo.ads.category = sites.dbo.ads.category + ', biologi-fysikk-kjemi';

它只是更新没有值为NULL的行..但它确实表示相同数量的行受到影响..怎么办?我应该制作案例吗?

1 个答案:

答案 0 :(得分:2)

存储逗号分隔值几乎总是一个坏主意,但如果你坚持这样做,这应该有效:

SET sites.dbo.ads.category =
    COALESCE(sites.dbo.ads.category + ', ','')
    + 'biologi-fysikk-kjemi';

这也可以避免让第一项(从NULL切换到非NULL)从逗号开始。

您看到此行为的原因是,根据ANSI标准。 NULL + string = NULL。你可以关闭它,但不建议:

SET CONCAT_NULL_YIELDS_NULL

  

控制是否将连接结果视为空值或空字符串值。

     

重要

     

在SQL Server的未来版本中,CONCAT_NULL_YIELDS_NULL始终为ON,任何明确将选项设置为OFF的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。