如何在临时表中插入“EXEC()”的结果

时间:2014-08-25 06:55:22

标签: sql sql-server

我需要帮助解决问题,我们公司有一家供应商为我们提供数据库。在该数据库中,供应商有一个包含大量t sql脚本的表。我想要做的是以下,我想做一个选择来找到脚本,然后执行脚本并将结果存储在变量或临时表格中。我不能改变vedor的脚本,所以我需要把结果变成我可以实现的东西。另一个问题是我不知道结果会有多少列。所以它必须是灵活的。就像一个脚本有5列,下一个脚本有8个,依此类推。

exsample:

DECLARE @SQL nvarchar(MAX) = ( Select distinct script_details
from scripttable where .......)

这将给我我想要使用的脚本,然后我使用 EXEC(@SQL) 执行脚本。

然后我的问题是,我想要的结果是变量或表。 我试着制作一个像这样的临时表:

create table #TmpTblSP (col1 varchar(MAX),col2 varchar(MAX),col3 varchar(MAX),col4 varchar(MAX),col5 varchar(MAX),col6 varchar(MAX),col7 varchar(MAX),col8 varchar(MAX),col9 varchar(MAX),col10 varchar(MAX),col11 varchar(MAX),col12 varchar(MAX))

然后

insert into #TmpTblSP
EXEC(@SQL)

This gives me the following error:
Msg 213, Level 16, State 7, Line 1
Column name or number of supplied values does not match table definition.

但是,如果我知道有多少列,并在插入中指定它可以工作。

insert into #TmpTblSP(Col1,Col2,Col3)
EXEC(@SQL)

但是你知道我的问题,我不知道每个剧本中有多少列。我可以为供应商提供的每个脚本制作一个脚本,但这很多,它就像该表中的3000个脚本,并且经常更改它们。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方式:

DECLARE @SQL nvarchar(MAX) = ( 
        Select distinct script_details 
        into #temptbl
        from scripttable where .......
        );

EXEC(@SQL);

答案 1 :(得分:0)

如果您不知道@sql提供了多少列,那么唯一的解决方案是使用SELECT INTO。我以这种方式使用它:

    DECLARE @QRY nvarchar(MAX) = ( Select distinct script_details
    from scripttable where .......)

      SET @sql = 'SELECT * into ' + @temptablename + ' FROM (' + @qry + ') A '

它提供了一些灵活性

请记住,在sys中检查以这种方式创建的表的结构很容易,因此如果需要,您可以根据此信息构建另一个@SQL。

我这也建议拆分" SELECT INTO"到2个部分 一个是

SELECT INTO ......... WHERE 1=2 

第二

INSERT INTO SELECT ......

创建表锁定所有DB。因此,尽可能快地创建它然后插入其中是很好的。