【问题标题】:ISNULL in SQL subquery not returning anythingSQL子查询中的ISNULL不返回任何内容
【发布时间】:2015-03-11 02:52:58
【问题描述】:

下面是触发的 SQL 的一部分,它使用子查询返回 TableString 列中的值。子查询将返回前两个值和 Fname 的“标记”,但之后什么也没有(甚至分号也不行)。 TableString 列是一个 nvarchar,设置为 255 个字符,并在插入或更新期间捕获所有相似数据。

INSERT INTO TransactionLog (TransactionDate, Operator, TableName, Action
                           , TableString, UserId)
SELECT LastChangeDate
     , 'Op'
     , @tableName
     , @action
     , CAST('sNum:' + CAST(sNumber as nvarchar(10)) + ' entType:' + EntityType 
            + ' Fname:' + ISNULL(FirstName, 'NULL') 
            + ' Lname:' + ISNULL(LastName, 'NULL') 
            + ' suff:' + ISNULL(NameSuffix, 'NULL') 
            + ' corpName:' + ISNULL(CorporateName, 'NULL' ) 
            + ' ctrlId:' + ISNULL(CAST(ControlId as nvarchar(3)), 'NULL') 
            AS nvarchar(30)) as TableString
     , LastChangeOperator
FROM deleted

TableString 中的返回值:

sNum:1000024 entType:S Fname

【问题讨论】:

  • 你真的应该让 TableString 成为一个 nvarchar(max) 字段。

标签: sql tsql


【解决方案1】:

这与ISNULL 无关,而是截断数据的结果。

注意:

.. AS nvarchar(30)

也就是说,更多的数据被省略了。 (在这种情况下,输出甚至不包含“Fname:”。)

【讨论】:

  • 好收获。他的返回值是 28 个字符,这似乎很奇怪。
  • @AbeMiessler 那是我的小费:)
【解决方案2】:

作为旁注,他的返回字符数为 28,因为 Nvarchar(30) 表示存储 30 个字节,而 Unicode (N) 是一个字母的两个字节,即使您存储的是非 Unicode。 varchar 声明中的数字不是字符数,而是要使用的字节数。当人们使用 Nvarchar 时,它真的很吸引人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多