我需要帮助解决问题,我们公司有一家供应商为我们提供数据库。在该数据库中,供应商有一个包含大量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个脚本,并且经常更改它们。
答案 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。因此,尽可能快地创建它然后插入其中是很好的。