【问题标题】:SQL Server Table definition from stored procedure result set存储过程结果集中的 SQL Server 表定义
【发布时间】:2010-03-19 14:13:51
【问题描述】:

有人知道从存储过程结果集中创建表定义的方法吗?

我有一个存储过程,它生成一个包含 30 多列的结果集,我想将它放入一个表中,而不必手动创建所有表列。

是否有内置程序可以转储列名和类型..?

谢谢。

【问题讨论】:

  • 我不知道。为什么要这样做?
  • 为了避免手动创建表,我只是想真正节省一些时间......我过去使用'INSERT EXEC'时遇到问题,其中列在存储中返回程序与表的程序不完全匹配。当这些过程返回如此多的列时,这可能会很痛苦。

标签: sql sql-server tsql


【解决方案1】:

你试过了吗?

DECLARE @sql NVARCHAR(MAX) = N'EXEC mydb.dbo.my_procedure;';

SELECT name, system_type_name, max_length, is_nullable FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1);

它不会为您构建表,但您可以根据列名的名称和类型快速创建它。

【讨论】:

    【解决方案2】:

    你“可以”做到,但我不知道我是否会推荐它:

    EXEC sp_configure 'Show Advanced Options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'Ad Hoc Distributed Queries', 1
    GO
    RECONFIGURE
    GO
    
    SELECT
      *
    INTO
      #table
    FROM
      OPENROWSET(
        'SQLNCLI',
        'SERVER=.;Trusted_Connection=yes',
        'EXEC StoredProcedureName'
      )
    

    【讨论】:

      【解决方案3】:

      如果这是一次性的,你可以试试这个(不是在生产中!)。

      我通常只是转到子过程并在返回结果集的查询上,在列选择列表和FROM 之间添加INTO YourNewTable。运行子过程 1 次,然后删除更改。

      然后您可以通过查看 SQl Server Management Studio 中的 YourNewTable 或任何表元数据查询来查看结果集列,例如:

      SELECT 
          * 
          FROM INFORMATION_SCHEMA.Columns 
          WHERE TABLE_NAME='YourNewTable'
          ORDER BY ORDINAL_POSITION
      

      【讨论】:

        【解决方案4】:

        在您的存储过程中,您需要使用“WHERE 1 = 0”执行“SELECT INTO”,因此它只会创建一个空表。

        如果要定义数据类型: 将您的列转换或转换为该数据类型

        如果你想要一个 NOT NULL 约束,那么你必须在选择中使用: isnull(yourcolumn,'123') 作为 yourcolumn 然后在 where 子句中放入 WHERE yourcolumn '123'

        【讨论】:

          【解决方案5】:

          【讨论】:

            猜你喜欢
            • 2012-01-15
            • 2010-09-08
            • 1970-01-01
            • 2014-12-07
            • 1970-01-01
            • 1970-01-01
            • 2011-08-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多