首页 > 解决方案 > 在查询结果中将空格和括号转换为 unicode

问题描述

我在 SQL Server 2012 中使用 CROSS APPLY & 和自定义构建的 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' ) 

该查询成功地取消了所有内容,但在此过程中,将空格、破折号、括号等转换为它们各自的 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' )

标签: sql-serverxmlunicodecross-apply

解决方案


编辑: 我现在记得你不是 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')

或包含 NULL

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')

推荐阅读