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