Sql server 在查询结果中将空格和方括号转换为unicode
我在SQLServer2012中使用了一个交叉应用和一个定制的XML函数(而不是UNPIVOT),在表中垂直移动值Sql server 在查询结果中将空格和方括号转换为unicode,sql-server,xml,unicode,cross-apply,Sql Server,Xml,Unicode,Cross Apply,我在SQLServer2012中使用了一个交叉应用和一个定制的XML函数(而不是UNPIVOT),在表中垂直移动值 SELECT A.USERID ,B.[ITEM] ,B.VALUE FROM #UPLOAD A CROSS APPLY [DBO].[TVF-XML-UNPIVOT-ROW]( (SELECT A.* FOR XML RAW) ) B WHERE [ITEM] NOT IN ('USERID' ) 查询成功地取消了对所有内容的锁定,但在此过程中,
SELECT A.USERID
,B.[ITEM]
,B.VALUE
FROM #UPLOAD A
CROSS APPLY [DBO].[TVF-XML-UNPIVOT-ROW]( (SELECT A.* FOR XML RAW) ) B
WHERE [ITEM] NOT IN ('USERID' )
查询成功地取消了对所有内容的锁定,但在此过程中,将空格、破折号、括号等转换为各自的UNICODE值,如下所示:
EMPID ITEM VALUE
123 _x0027_October_x0020_Bonus_x0020__x0028_Perm_x0020__x002B__x0020_Temp_x0029_ 28.01
预期产出:
EMPID ITEM VALUE
123 October Bonus (Perm + Temp) 28.01
下面是函数、一些可以使用的临时值以及代码本身。如何在没有unicode值的情况下格式化字符串
CREATE FUNCTION [dbo].[tvf-XML-UnPivot-Row](@XML xml)
Returns Table
As
Return (
Select Item = xAttr.value('local-name(.)', 'varchar(100)')
,Value = xAttr.value('.','varchar(max)')
From @XML.nodes('//@*') xNode(xAttr)
)
DROP TABLE #UPLOAD
CREATE TABLE #UPLOAD (USERID INT,['October Bonus (Perm + Temp)] FLOAT NOT NULL );
INSERT INTO #UPLOAD VALUES (123,20.3),(240,35)
SELECT A.USERID
,B.[ITEM]
,B.VALUE
FROM #UPLOAD A
CROSS APPLY [DBO].[TVF-XML-UNPIVOT-ROW]( (SELECT A.* FOR XML RAW) ) B
WHERE [ITEM] NOT IN ('USERID' )
编辑:我现在想起来了,你不是2016年的+ 如果2016+您可以使用此函数而不是XML方法
CREATE FUNCTION [dbo].[tvf-JSON-Unpivot-Row](@json varchar(max))
Returns Table
As Return
Select [Key]
,Value
From OpenJson(@json)
示例
Select A.ID
,B.*
from YourTable A
Cross Apply [dbo].[tvf-JSON-Unpivot-Row]( (Select A.* For JSON Path,Without_Array_Wrapper ) ) B
Where [Key] not in ('ID')
或包含空值
Select A.ID
,B.*
from YourTable A
Cross Apply [dbo].[tvf-JSON-Unpivot-Row]( (Select A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES ) ) B
Where [Key] not in ('ID')
看起来很熟悉:)JSON方法将更好地处理列名这是XML方法的一个已知问题。你有一些难听的名字,我唯一能想到的就是一系列replace()'sOkay,很高兴知道!我从一个企业管理的excel文件中获取数据,对于列名我只能做这么多。我有点想:)这就是为什么数据人应该统治这个词。只是为了澄清一下。XML对节点和属性名有点挑剔