【问题标题】:Concat NULL with Varchar SQL Server 2008Concat NULL 与 Varchar SQL Server 2008
【发布时间】:2017-07-31 08:46:51
【问题描述】:

我想问一下如何在不得到NULL 的情况下将nvarchar 列与NULL 连接起来?我想使用SELECT 创建一个INSERT 脚本,但是当任何值为NULL 时,我只能得到NULL

SELECT TOP 10 
    'IF NOT EXISTS(SELECT 1 FROM tblParameterKey 
                   WHERE keyNames='''
        + CAST(ISNULL([keyNames], 'NULL') AS NVARCHAR(255)) + ''')
     BEGIN
         INSERT INTO tblParameterKey VALUES(''' + CAST(ISNULL([keyNames], 'NULL') AS NVARCHAR(255))+''')
     END'
FROM tblParameterKey

此查询仅在 value 不为 null 时返回正确的插入。如果值为 null,则返回带有“NULL”的插入,这是不正确的,因为它将作为 varchar 而不是作为 null 值插入。如果我删除“”,整个结果将变为空。

【问题讨论】:

  • 在执行查询之前不能检查keyNames是否为空吗?
  • @JoshuaDuxbury 如果我删除它,整个结果将为空。那是因为 + 在数学中工作,愚蠢的 sql server 试图将 NULL 添加到字符串的其余部分,因此导致 NULL。
  • 我明白了,keyNames 来自 tblParamaterKey 表吗?
  • 对不起,keyNames 来自哪里?
  • @JoshuaDuxbury 是的,它是该表的列。

标签: sql-server-2008 select-insert


【解决方案1】:

编辑 - 也许将 NULLIF 语句放在查询字符串中,这样它将是 null 而不是 string null

SELECT TOP 10 
    'IF NOT EXISTS(SELECT 1 FROM tblParameterKey 
                   WHERE keyNames=NULLIF('''
        + [keyNames] + ''', 'NULL') AS NVARCHAR(255))
     BEGIN
         INSERT INTO tblParameterKey VALUES(NULLIF(''' + [keyNames]+''', 'NULL') AS NVARCHAR(255))
     END'
FROM tblParameterKey

【讨论】:

  • 那行不通,这只是示例查询,有很多列,其中一些可以为空,我需要为整个表插入脚本,所以我需要空值。
  • 这将与在 ISNULL 函数中提供 NULL 而不是 'NULL' 执行相同的操作,整个结果将为 null。
  • 编辑了我的答案@Nogi
  • 现在看起来它会起作用,你只需要使用 +CAST(ISNULL([keyNames],'NULL') AS NVARCHAR(255))+ 而不是 +keyNames+ 因为它会再次导致NULL。这样会生成 INSERT INTO tblParameterKey VALUES(NULLIF('NULL', 'NULL')) 谢谢!
猜你喜欢
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2012-01-14
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多