为什么 SQL Server Pivot 对 TabTypeId 区分大小写,而不是将其视为实际的列名称?

Nar*_*dra 1 sql t-sql sql-server pivot-table

在 T-Sql 中,我正在解析 JSON 并使用PIVOT.

Select * from (select [key],convert(varchar,[value])[value] 
from openjson ('{"Name":"tew","TabTypeId":9,"Type":3}'))A
    pivot(max(value) for [key] in ([Name],tabTypeId,[Type]))b
Run Code Online (Sandbox Code Playgroud)

它不被视为tabTypeId等于TabTypeId。我正在NULLtabTypeId.
如果我使用TabTypeId我就会得到价值9
为什么会发生这种情况?

use*_*983 6

它不PIVOT区分大小写,而是从中返回的数据OPENJSON。如果检查从它返回的数据,您将看到该列key是二进制排序规则:

SELECT name, system_type_name, collation_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT [key], CONVERT(varchar, [value]) AS [value] FROM OPENJSON(''{"Name":"tew","TabTypeId":9,"Type":3}'');',NULL,NULL)
Run Code Online (Sandbox Code Playgroud)
姓名 系统类型名称 排序规则名称
钥匙 nvarchar(4000) Latin1_General_BIN2
价值 varchar(30) SQL_Latin1_General_CP1_CI_AS

对于二进制排序规则,字符的实际字节必须匹配。因此N'tabTypeId'N'TabTypeId'等于和具有值和。N'T'N't'binary0x54000x7400

虽然我不确定你为什么要使用PIVOT;只需在调用中定义您的列OPENJSON

SELECT name, --Columns are intentionally demonstrating non-case sensitivity
       tabTypeId,
       type
FROM OPENJSON('{"Name":"tew","TabTypeId":9,"Type":3}')
        WITH (Name varchar(3),
              TabTypeId int,
              Type int);
Run Code Online (Sandbox Code Playgroud)

请注意,WITH子句中的OPENJSON列名仍然区分大小写。tabTypeId int也会产生NULL. 如果您“必须”在您之前一个名为tabTypeIdDefined 的列,那么您将使用它。SELECTtabTypeId int '$.TabTypeId'