【问题标题】:Inserting Different Value IN a Table在表中插入不同的值
【发布时间】:2017-12-14 01:30:15
【问题描述】:

我正在基于服务器上包含多个数据库的数据库结果集创建一个表。 我的表将创建一个包含 Database_Name 的列列表

例如:

 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

【问题讨论】:

  • 我不想将数据插入到 Temp_Comp 表中的数据库中的特定值,其名称将在 Temp_comp 表中

标签: sql sql-server tsql pivot


【解决方案1】:

我不想将数据插入到 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)',因此您可能需要在插入之前转换值。

【讨论】:

  • lad2025 我的表列基于您获得的服务器上的数据库数量。现在我不想将数据插入到包含数据库名称的表 Temp_Comp 的第 1 列中。现在从与 Temp_comp 列相同的数据库中将特定记录放入其中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多