我有一个包含这些列的表:
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
....
标题代码应为01到50之间的列名称,数据应为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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句