0

下面是触发的 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
4

2 回答 2

3

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

注意:

.. AS nvarchar(30)

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

于 2012-09-04T17:38:04.050 回答
0

附带说明一下,他的返回字符数是 28,因为 Nvarchar(30) 意味着存储 30 个字节,而 Unicode (N) 是一个字母的两个字节,即使您存储的是非 Unicode。varchar 声明中的数字不是字符数,而是要使用的字节数。当人们使用 Nvarchar 时,它真的很吸引人。

于 2015-03-10T18:52:58.683 回答