sql-server - 在查询结果中将空格和括号转换为 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' )
解决方案
编辑: 我现在记得你不是 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')
推荐阅读
- java - 使用接口构造函数参数类型使类不可变
- rust - 如何在 Rust 中编写自己的可链接迭代器函数?
- c# - 有或没有等待调用的 C# 异步方法调用给出相同的结果?
- python - Opencv - 从游戏图像中提取数据
- amazon-web-services - 在 AWS 中管理客户端
- vba - (VBA-PPT) Redim 错误 9?索引超出范围
- sql - 使用非标准编号枚举具有父子关系的表
- android - 如何将 html 描述(来自 API 响应)呈现为 Android EditText 输入字段中的简单文本?
- c++ - std::String 调整大小不会改变地址
- reactjs - 如何修复所有 .js 文件中的 history.push?