動的SQLを使用せずに、列名がselectを介して実行されるUnpivot操作を実行することは可能ですか?
これを試しましたが失敗します。
SELECT *
FROM [dbo].[Report]
UNPIVOT
(
Value
FOR WeekName IN
(
SELECT COLUMN_NAME FROM information_schema.columns c
WHERE c.TABLE_NAME = 'Report'
AND ORDINAL_POSITION > 1
ORDER BY ORDINAL_POSITION
)
) u
UNPIVOTは、テーブルのピボットを解除するための最良の方法ではありません。値を使用したCROSSAPPLYははるかに優れた方法です。
申し訳ありませんが、これについてはDynamicSQLから逃れることはできないと思います。
このコードは、テーブル全体を動的にアンピボットします。
DECLARE @tablename VARCHAR(255) = 'Employee'
DECLARE @schemaname VARCHAR(255) = 'HumanResources'
DECLARE @qrystr NVARCHAR(4000) = ''
;with cte
AS
(
SELECT
c.column_id
,c.name
FROM
sys.objects o
INNER JOIN sys.columns c
ON
o.object_id = c.object_id
WHERE
o.name = @tablename
AND
SCHEMA_NAME(o.schema_id) = @schemaname
)
SELECT
@qrystr =
'SELECT A.[' + (SELECT name FROM cte WHERE column_id = 1) + ']
,C.Name
,C.Val
FROM
[' + @schemaname + '].[' + @tablename + '] A
CROSS APPLY (VALUES ' +
STUFF((SELECT ',' + '(CAST(['+name + '] AS VARCHAR(255)),''' + name + ''')' FROM cte WHERE column_id > 1 ORDER BY column_id FOR XML PATH ('')), 1, 1, '')
+ ' ) C(Val,Name)'
EXEC (@qrystr)