sql - 要取消透视的存储过程
问题描述
我有一个包含这些列的表:
surname name birthdate id_doc role 01 02 ... 50
Vardy Jack 19870215 1234 'emp' 20200110 20200527 20200610
其中从 01 到 50 的字段是日期。我需要一张这样的桌子:
surname name birthdate id_doc role title_code data
Vardy Jack 19870215 1234 'emp' 01 20200110
Vardy Jack 19870215 1234 'emp' 02 20200527
....
其中title code应该是从01到50的列名,data应该是mytable中该列的值
我通过查看较旧的问题来完成此存储过程:
CREATE PROCEDURE proc
AS
BEGIN
DECLARE @UnpivotList NVARCHAR(MAX) = N'';
SELECT @UnpivotList = CONCAT(@UnpivotList, ',(''', c.name, ''', fe.', c.name, ')')
FROM
sys.columns c
WHERE
c.object_id = OBJECT_ID('mytable')
AND c.column_id > 5;
DECLARE @sql NVARCHAR(MAX) = CONCAT(N'
SELECT
fe.surname,
fe.name,
fe.birthdate,
fe.id_doc,
fe.role,
ul.title_code,
ul.Data
FROM
mytable fe
CROSS APPLY ( VALUES ', STUFF(@UnpivotList, 1, 1, ''), N') ul (title_code, Data)');
EXEC sys.sp_executesql @sql;
END
但我在附近遇到语法错误'.01'
。有人可以帮我吗?
解决方案
问题在于列名:由于它们以数字开头,因此您需要引用标识符 - 在 SQL Server 中,您需要使用方括号。您可以在第一个查询中处理这个问题。
SELECT @UnpivotList = CONCAT(@UnpivotList, ',(''', c.name, ''', fe.[', c.name, '])')
FROM sys.columns c --^ here ^ --
WHERE
c.object_id = OBJECT_ID('mytable')
AND c.column_id > 5;
推荐阅读
- javascript - Jquery 在从 Webpack 注入后无法在 React 应用程序中全局运行
- python - 无法为 Google 助理生成凭据
- amazon-sqs - 如何找出具有特定 groupId 的所有消息已从 SQS 中的队列中读取?
- c# - NLog 使用日志文件保存二进制数据(特别是图像)
- r - hadoop 流在 RHadoop 中失败,错误代码为 1
- python - 错误:尽管有“if ... is not None”语句,但“NoneType”对象没有属性“split”
- javascript - getElementById 在 IE 11 上不起作用:HTML5
元素 - python - 在 Python matplotlib 中保留尺寸的同时提高图形的分辨率
- java - 无法解析 JSP 中的方法 getParameter()
- git - 工作树中的 Git 别名在 git 2.16 中未按预期工作