如何为存储过程的结果生成创建表

时间:2018-10-22 08:13:18

标签: sql-server tsql stored-procedures

我有许多带有许多列的存储过程。 对于它们中的每一个,我都需要将SProc的结果放入临时表中,因此,我必须首先声明这些表。这是我要自动化的繁琐工作。 给定SProc的名称,是否有可能获取可以包含SProc结果的表的脚本? 我会尝试使用“ sp_describe_first_result_set”,但我的几个SProc只能通过DynamicSQL生成其结果集(这就是许多列的原因...),而且在这种情况下,“ sp_describe_first_result_set”似乎不起作用(不足为奇)

谢谢

1 个答案:

答案 0 :(得分:1)

您不能以任何方式与sp_decribe_first_result_set的{​​{3}}作斗争。我花了很多时间(并继续花费一些坐骑),结果是我们需要学习与他们一起生活。

关于您的问题,我还存储了过程,该过程根据其参数生成不同的T-SQL动态语句。和您一样,有时我需要存储其结果集(并且我们需要在存储数据之前定义临时表的结构)。

为了改善这一点,我添加了一个描述结果集的模式,而不是返回数据。它是这样的:

IF [dbo].[fn_Utils_RegexIsMatch] ('(?i)\[DescribeFirstResultSet]', @MiscSettings) = 1
    BEGIN;
        SET @DynamicTSQLStatement = [dbo].[fn_Utils_RegexReplace] (@DynamicTSQLStatement, 'CREATE TABLE #([^\s]+)', 'DECLARE @$1 TABLE');
        SET @DynamicTSQLStatement = REPLACE(@DynamicTSQLStatement, '#', '@');
        SET @DynamicTSQLStatement = [dbo].[fn_Utils_RegexReplace] (@DynamicTSQLStatement, 'DROP TABLE IF EXISTS.+?;', '');

        SELECT [column_ordinal]
              ,REPLACE([name], '@', '#') AS [name]
              ,[system_type_name]
              ,IIF([column_ordinal] = 1, '', ',') + '[' + REPLACE([name], '@', '#') + '] ' + UPPER([system_type_name]) AS [column_definition]
        FROM [sys].[dm_exec_describe_first_result_set] (@DynamicTSQLStatement, NULL, 0); 

        EXEC [sys].[sp_describe_first_result_set] @DynamicTSQLStatement;

        RETURN;
    END;
ELSE
    BEGIN;
        EXEC sp_executesql @DynamicTSQLStatement;
    END;

因此,就我而言,开发人员正在通过参数设置ze需要的列,但正在使用description选项调用存储过程。因此,结果是这样的:

limitations

一些注意事项:

  • 您可以尝试使用定义来创建临时表,然后在动态T-SQL语句中执行存储过程
  • 请注意,我正在将我的临时表替换/转换为表变量(这又是必要的限制)
  • 如果要使用CLR regex replace功能,请选中此enter image description here