我正在寻找一种更合适的方法来执行多个插入到不存在的表中。 由于我不知道所选列的数据类型,因此不容易预先创建表。 “使用创建插入”可以,但我不认为有这样的东西。
有没有更好的方法可以选择进入然后插入?
这是我做的“坏”方式,在一个非常简单的示例中,以证明问题。
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
这个解决方案“糟糕”,因为你需要两个位置的声明。在这里显示的情况下,这是微不足道的,但是当语句变得更复杂时,这可能成为一个问题。
答案 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
您有一个奇怪的查询,因为现在它从此表中获取sys.tables
和SELECT TOP 10 Descriptions
中的第一个表的次数与此表中的列数相同。
答案 1 :(得分:0)
SELECT INTO语句将数据从一个表复制到一个新表中,这可能会对您有所帮助。
实施例: -
SELECT * INTO新表格 来自oldtable 条件
以上也支持连接。