当结果的模式是先验未知时,如何在表中插入动态查询的结果?

时间:2016-09-10 00:45:14

标签: sql-server sql-server-2012

请注意以下简单的SQL代码:

CREATE TABLE #tmp (...) -- Here comes the schema
INSERT INTO #tmp
EXEC(@Sql)              -- The @Sql is a dynamic query generating result with a known schema

一切都很好,因为我们知道@Sql生成的结果的模式。

但是,如果架构未知,该怎么办?在这种情况下,我使用Powershell生成一个类似的Sql查询:

SET @Sql = '
SELECT *
INTO ##MySpecialAndUniquelyNamedGlobalTempTable
FROM ($Query) x
'
EXEC(@Sql)

(我省略了一些细节,但保留了代码的“精神”)

它工作正常,但$Query可能存在严重限制 - 它必须是单个SELECT语句。

这对我来说不是很好,我希望能够像这样运行任何Sql脚本。问题是,我不能再将它连接到FROM (,它必须由EXECsp_executesql执行。但后来我不知道如何将结果收集到表中,因为我不知道该表的模式。

是否可以在Sql Server 2012中使用?

动机:我们在不同的Sql服务器上有很多QA数据库,而且我经常在所有这些数据库上运行查询,以便找到最有可能为我的测试产生最佳结果的数据库。唉,我只能运行单个SELECT语句,这很不方便。

1 个答案:

答案 0 :(得分:1)

我们为此目的使用SP和OPENROWSET。

首先根据您需要的查询创建SP,而不是使用OPENROWSET将数据导入临时表:

USE Test

DECLARE @sql nvarchar(max),
        @query nvarchar(max)

SET @sql = N'Some query'

IF OBJECT_ID(N'SomeSPname') IS NOT NULL DROP PROCEDURE SomeSPname

SET @query =N'
CREATE PROCEDURE SomeSPname
AS
BEGIN
    '+@sql+'
END'

EXEC sp_executesql @query

USE tempdb
IF OBJECT_ID(N'#temp') IS NOT NULL DROP TABLE #temp

SELECT * 
INTO #temp
FROM OPENROWSET(
               'SQLNCLI',
               'Server=SERVER\INSTANCE;Database=Test;Trusted_Connection=yes;',
               'EXEC dbo.SomeSPname')

SELECT *
FROM #temp