Как уже упоминалось в комментариях, вам нужно использовать динамический SQL.На основании вашей (небольшой) выборки это работает, однако, вам решать, нужно ли вам вносить в него какие-либо изменения в соответствии с вашими потребностями.оператор PRINT
- ваш друг (который, возможно, вам придется изменить на SELECT
, если у вас более 4000 символов):
CREATE TABLE dbo.SampleTable (UserId int,
LastName varchar(50),
FirstName varchar(50),
Param1 varchar(6),
Param2 varchar(6),
[Date] date);
GO
INSERT INTO dbo.SampleTable
VALUES (1,'Snow','John','Text1','Text1','20190101'),
(2,'Lannister','Tyrion','Text1','Text1','20190101'),
(3,'Targaryen','Daenerys','Text2','Text2','20190101'),
(1,'Snow','John','Text3','Text2','20190102'),
(2,'Lannister','Tyrion','Text3','Text2','20190102'),
(3,'Targaryen','Daenerys','Text3','Text3','20190102');
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT UserId,' + NCHAR(13) + NCHAR(10) +
STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) +
N' MAX(CASE [Date] WHEN ' + QUOTENAME(CONVERT(varchar(8),ST.[Date],112),'''') + N' THEN ' + QUOTENAME(C.COLUMN_NAME) + N' END) AS ' + QUOTENAME(C.COLUMN_NAME + N':' + REPLACE(CONVERT(varchar(10),ST.[Date],102),N'.',N'-'))
FROM INFORMATION_SCHEMA.COLUMNS C
CROSS JOIN (SELECT DISTINCT [Date]
FROM dbo.SampleTable) ST
WHERE C.TABLE_SCHEMA = N'dbo'
AND C.TABLE_NAME = N'SampleTable'
AND C.COLUMN_NAME LIKE N'Param%'
ORDER BY ST.[Date],
C.ORDINAL_POSITION
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,3,N'') + NCHAR(13) + NCHAR(10) +
N'FROM dbo.SampleTable' + NCHAR(13) + NCHAR(10) +
N'GROUP BY UserId' + NCHAR(13) + NCHAR(10) +
N'ORDER BY UserId;';
PRINT @SQL; --Your Debugging best friend
EXEC sp_executesql @SQL;
GO
DROP TABLE SampleTable
db <> fiddle