【问题标题】:SSMS: Create a table script from results of a procedureSSMS:从过程的结果创建表脚本
【发布时间】:2015-02-15 03:13:18
【问题描述】:

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

是否可以在 Sql Server Management Studio 中将过程返回的结果脚本化到创建表脚本中。

假设我在一个新的查询面板中执行我的脚本。下面我得到返回的结果。我正在寻找的选项类似于例如右键单击结果并选择“脚本到表中”。或者类似于您在表上选择“编辑前 200 行”然后在返回的结果中右键单击 -> 窗格 -> 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    

【问题讨论】:

  • 您可能会发现这很有帮助stackoverflow.com/questions/8805275/…
  • 是的,在我提出问题之前,我一直在检查那个。不幸的是,如果可能的话,我必须依赖免费工具。我将把它添加到问题中。至于其他建议,我宁愿避免手动输入表格列。
  • 也许你可以改变你的动态 sql 查询来插入临时表?
  • @jpw 是否可以不手动声明临时表?我不会避免输入所有 +100 列。
  • @jpw 我已经添加了相关过程的模拟版本。

标签: sql-server ssms


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不断收到一些错误。我猜连接字符串中有一些错误。我也收到“无法完成延迟准备”。仍然OPENROWSET 听起来是正确的方法。
【解决方案2】:

如果你使用SSMSBoost工具栏那么它有一个“脚本网格数据”选项:

【讨论】:

    【解决方案3】:

    这将创建一个名为NewTable的表

    SELECT *
    INTO NewTable
    FROM AnotherTable
    

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

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 2012-08-19
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多