如何插入表创建

时间:2017-12-05 12:39:36

标签: sql-server tsql

我正在寻找一种更合适的方法来执行多个插入到不存在的表中。 由于我不知道所选列的数据类型,因此不容易预先创建表。 “使用创建插入”可以,但我不认为有这样的东西。

有没有更好的方法可以选择进入然后插入?

这是我做的“坏”方式,在一个非常简单的示例中,以证明问题。

set nocount on

declare 
    @name sysname = '',
    @i int = 0,
    @sql nvarchar(4000) = ''

declare test cursor for 
    select top 10 a.name from sys.tables a inner join sys.columns b on a.object_id = b.object_id --and b.name = 'description' 
open test
fetch next from test into @name
while (@@FETCH_STATUS <> -1)
begin

    if @i = 0 begin


        set @sql = 'select distinct top 10 description into #t1 from ' + @name + ''
        select @sql
        --  exec sp_executesql @sql

    end
    else begin

        set @sql = 'insert #t1 select distinct top 10 description into #t1 from ' + @name + ''
        select @sql
        --  exec sp_executesql @sql

    end
    set @i = @i + 1
    fetch next from test into @name
end
close test
deallocate test

if object_id ('tempdb..#t1') is not null select * from #t1

这个解决方案“糟糕”,因为你需要两个位置的声明。在这里显示的情况下,这是微不足道的,但是当语句变得更复杂时,这可能成为一个问题。

2 个答案:

答案 0 :(得分:1)

您可以将查询简化为以下内容:

set nocount on

declare 
    @name sysname = '',
    @i int = 0,
    @sql nvarchar(4000) = N''

if object_id ('tempdb..#t1') is not null DROP TABLE #t1

;WITH cte AS (
    select top 10 a.[name]
    from sys.tables a 
    inner join sys.columns b 
        on a.object_id = b.object_id --and b.name = 'description' 
)

SELECT @sql = @sql + N'UNION ALL 
select distinct top 10 description 
from ' + QUOTENAME([name])  + CHAR(13)
FROM cte

SELECT @sql = N';WITH cte AS (' + STUFF(@sql,1,10,') SELECT * INTO #t1 FROM cte')

PRINT @sql
--EXEC (@sql)

select * from #t1
  • 没有光标或while循环;
  • 在查询执行之前删除临时表(如果存在);

您有一个奇怪的查询,因为现在它从此表中获取sys.tablesSELECT TOP 10 Descriptions中的第一个表的次数与此表中的列数相同。

答案 1 :(得分:0)

SELECT INTO语句将数据从一个表复制到一个新表中,这可能会对您有所帮助。

实施例: -

SELECT * INTO新表格 来自oldtable 条件

以上也支持连接。