SSMS:根据过程的结果创建 table 脚本

SSMS: Create a table script from results of a procedure

我有一段动态 sql 查询。我想将结果保存在临时 table 中。但是查询 returns +100 个字段,所以我不想手动输入 Create table 脚本。

是否可以在 Sql Server Management Studio 中将过程返回的结果编写成脚本,写入到创建 table 脚本中。

假设我在一个新的查询面板中执行我的脚本。下面我得到返回的结果。我正在寻找的选项类似于例如右键单击结果并 selecting "Script into a table"。或者类似于在 table 上 select "Edit top 200 rows" 然后在返回结果中右键单击 -> 窗格 -> SQL 你可以编辑SQL 即生成结果。

对于过程的结果,SSMS 中是否可能有类似的东西?如果需要外部工具,有没有免费的?我正在使用 SQL Server 2012 和 SSMS 2012。一些适用于以前版本的工具已获得 2012 的许可。

下面是程序中核心代码的一些模拟版本:

exec dbo.spDynamic
    @ID , 
    @ID2 ,
    @Parameters ,
    @prefixLogic,
    @selectprefix,
    @selectsuffix,
    @Table_1,
    @Function_1,
    @SelectExtra_1,
    @Where_1,
    @Function_2,
    @SelectExtra_2,
    @Where_2,
    @On,
    @finalWhere
    @tempSchema
    @tempTable
    @tempWhere

这是 spDynamic 的重要部分:

Declare @sql nvarchar(max)
set @sql =
    + @parameterLogic 
    + ' ' + @prefixlogic
    + @selectprefix
    + ' SELECT ' + @DeltaLogic
    + ' FROM ( Select * ' + Case When @ID < 0 Then Replace(@SelectExtra_1, '<ID>', CAST(@ID AS nvarchar))
                                When @ID = 0 Then Replace(@SelectExtra_2, '<ID>', CAST(@ID AS nvarchar))
                                Else Replace(@Table_1, '<ID>', CAST(@ID AS nvarchar)) End

        + ' From ' + Case When @ID < 0 Then @Function_1 + ' ' + @Where_1 
                        When @ID = 0 Then @Function_2 + ' ' + @Where_2 
                        Else @tempSchema + @tempTable 
        + ' ' + Replace(@tempWhere, '<ID>', CAST(@ID AS nvarchar)) End
    + ' ) A '  
    + ' FULL OUTER JOIN '
    + ' ( Select * ' + Case When @ID2 < 0 Then Replace(@SelectExtra_1, '<ID>', CAST(@ID2 AS nvarchar))
                                When @ID2 = 0 Then Replace(@SelectExtra_2, '<ID>', CAST(@ID2 AS nvarchar))
                                Else Replace(@Table_1, '<ID>', CAST(@ID2 AS nvarchar)) End
        + ' From ' + Case When @ID2 < 0 Then @Function_1 + ' ' + @Where_1 
                When @ID2 = 0 Then @Function_2 + ' ' + @Where_2 
                Else @tempSchema + @tempTable 
        + ' ' + Replace(@tempWhere, '<ID>', CAST(@ID2 AS nvarchar)) End
    + ' ) B ' + @on
    + @finalWhere
    + @selectsuffix

exec sp_sqlexec @sql    

这将创建一个名为 NewTable

的 table
SELECT *
INTO NewTable
FROM AnotherTable

你可以改变你的动态 SQL 来做到这一点吗?

一种解决方案是在 OPENROWSET 函数内执行存储过程,如 here 所述。

这允许您即时创建 table,例如通过编写:

SELECT * INTO MyTempTable
FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes',
    'EXEC myStoredProc')

如果您不想将实际数据放入 MyTempTable,您可以在末尾添加 WHERE 1 = 0。之后,您可以像编写任何其他脚本一样编写 MyTempTable table.

如果您使用 SSMSBoost 工具栏,那么它有一个 "script grid data" 选项: