请注意以下简单的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 (
,它必须由EXEC
或sp_executesql
执行。但后来我不知道如何将结果收集到表中,因为我不知道该表的模式。
是否可以在Sql Server 2012中使用?
动机:我们在不同的Sql服务器上有很多QA数据库,而且我经常在所有这些数据库上运行查询,以便找到最有可能为我的测试产生最佳结果的数据库。唉,我只能运行单个SELECT语句,这很不方便。
答案 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