您需要在元数据中定义某种顺序才能使其正常工作。对于我的脚本,我添加了 ColumnOrder 以供参考
/*Setup Metadata table*/
DROP TABLE IF EXISTS #Metadata
CREATE TABLE #Metadata (
ColumnOrder INT IDENTITY(1,1) PRIMARY KEY /*Need to have some sort of defined column order, I created one for illustration purposes*/
,[Column] SYSNAME
,[Type] VARCHAR(255)
)
/*Load data*/
INSERT INTO #Metadata
VALUES
('ID','int')
,('Name','varchar(50)')
,('Location','varchar(50)')
/*Create dynamic SQL*/
DECLARE @DynamicSQL NVARCHAR(MAX);
/*Create column list*/
;WITH cte_Column AS (
SELECT ColumnOrder,
[Column]
,[Type]
,DataColName = CONCAT('Col',Row_Number () OVER (ORDER BY A.ColumnOrder))
FROM #Metadata AS A
)
SELECT @DynamicSQL
= STRING_AGG(
Concat(QUOTENAME([Column])
,' = CAST ('
,DataColName
,' AS '
,A.[Type]
,')')
,CONCAT(CHAR(13),CHAR(10),',') /*Line break + comma separators*/
)
WITHIN GROUP (ORDER BY A.ColumnOrder) /*Ensures columns concatenated in order*/
FROM cte_Column AS A
Set @DynamicSQL = CONCAT('SELECT ',@DynamicSQL,CHAR(13),CHAR(10),' FROM dbo.Data')
PRINT @DynamicSQL
/*Uncomment to execute*/
--EXEC (@DynamicSQL)