我正在基于包含多个数据库的服务器上的数据库结果集创建表。 我的表将创建一个包含Database_Name
的列列表FOR EG:
DECLARE @strt INT,@End INT,@Database NVARCHAR(20), @ColumnDeclaration VARCHAR(2000),@SqlSelect NVARCHAR(MAX),@column_Name NVARCHAR(255)
SELECT * INTO #T FROM SYS.DATABASES
ORDER BY NAME
SELECT @ColumnDeclaration=STUFF(( SELECT ', ' + Name + ' NVARCHAR(255)'
FROM #T
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'), 1, 1, '')
SET @SqlSelect=' CREATE TABLE Temp_Comp (' + @ColumnDeclaration + ');'
PRINT @SqlSelect
EXEC (@SqlSelect)
SELECT * FROM Temp_Comp
答案 0 :(得分:0)
我不想将数据INTO Temp_Comp表中的特定值插入 名称将在Temp_comp表中的数据库
不确定你想要实现什么,但我认为你想要的东西是:
DECLARE @strt INT,@End INT,@Database NVARCHAR(20), @ColumnDeclaration NVARCHAR(MAX),@SqlSelect NVARCHAR(MAX),@column_Name NVARCHAR(255)
SELECT * INTO #T
FROM SYS.DATABASES
ORDER BY NAME;
SELECT @ColumnDeclaration=STUFF(( SELECT ', ' + QUOTENAME(Name) + ' NVARCHAR(255)'
FROM #T
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'), 1, 1, '');
SET @SqlSelect=' CREATE TABLE Temp_Comp (col_desc NVARCHAR(200), ' + @ColumnDeclaration + ');';
SELECT @SqlSelect;
EXEC (@SqlSelect);
SET @SQLSelect = ' INSERT INTO Temp_Comp(col_desc, ' + REPLACE(@ColumnDeclaration, 'NVARCHAR(255)', '') + ')' +
' SELECT col,'+ REPLACE(@ColumnDeclaration, 'NVARCHAR(255)', '') +' FROM (' +
' SELECT name, sub.* FROM sys.databases' +
' OUTER APPLY (SELECT ''database_id'', CAST(database_id AS NVARCHAR(MAX)) UNION ALL SELECT ''compatibility_level'', CAST(compatibility_level AS NVARCHAR(MAX)) ) sub(col, val)) src' +
' PIVOT (MAX(val) FOR name IN ('+ REPLACE(@ColumnDeclaration, 'NVARCHAR(255)', '') +') ) piv';
SELECT @SQLSelect;
EXEC (@SQLSelect);
<强> DBFiddle 强>
结果:
为了INSERT
你可以使用动态PIVOT。要添加更多值,只需扩展OUTER APPLY
部分。
请注意,您已将列定义为' NVARCHAR(255)'
,因此您可能需要在插入前转换值。