【问题标题】:How to Auto Generate Code for Stored Procedure Column Data Types - SQL Server如何为存储过程列数据类型自动生成代码 - SQL Server
【发布时间】:2019-09-23 17:17:40
【问题描述】:

我想要的最终结果是能够简单地从存储过程中选择。我在互联网上搜索过,不幸的是,互联网上说不能这样做,您首先需要创建一个临时表来存储数据。我的问题是您必须在执行存储过程之前首先定义临时表中的列。这只是耗时。我只是想从存储过程中获取数据并将其粘贴到临时表中。

从编码的角度来看,实现此目标的 FASTEST 途径是什么?简而言之,首先必须从存储过程中查找返回的字段,然后将它们全部写出来,这是非常耗时的。

是否有某种工具可以仅基于存储过程构建 CREATE Table 语句?请参阅屏幕截图以进行说明。

我处理的大多数存储过程都有 50 多个字段。我不期待手动定义每个字段。

这是很好的SO Post,它让我走到了这一步,但不是我所希望的。这仍然需要太多时间。有经验的 SQL Server 人员在做什么?我最近才从 Oracle 跳转到 SQL Server,据我所知,Temp Tables 在 SQL Server 中很重要。

【问题讨论】:

  • 有些东西在这里并没有完全加起来。您要求从存储过程中进行选择。如果您的存储过程中有一个选择,它将返回一个数据集。因此,除非您使用该临时表做某事,否则这似乎真的很令人费解。有一些工具可以从表格中展开列列表。也许有些可能会为存储过程这样做。但为什么呢?
  • @JacobH 为什么... 测试 - 我无法将存储过程加入到其他表中。
  • @CodeNovice 看到您的最后一条评论后,您可能需要考虑表值函数。如果有问题的存储过程不执行任何更新或需要动态 SQL,这可能是另一种选择。
  • @CodeNovice 查看您的 DBA 是否可以创建自己的模式。因此,不是 [dbo].[...],而是 [YourUserID].[...] 或者甚至创建一个沙箱数据库(在同一台服务器上),您可以在其中创建可以从主数据库。例如 select * from [MySandbox].[dbo],[myTableValuedFunction]()
  • @CodeNovice 一旦您改进的功能得到演示和验证,它就可以将其迁移到主数据库。我的建议是继续推动增值。

标签: sql-server stored-procedures temp-tables


【解决方案1】:

如果你不介意##temp table 和一些动态 SQL

注意:正如 Luis Cazares 正确指出的那样......由于并发问题,##temp 存在冲突风险

示例

Declare @SQL  varchar(max) = 'Exec [dbo].[prc-App-Lottery-Search] ''8117'''
Declare @temp varchar(500) = '##myTempTable'

Set @SQL = '
If Object_ID(''tempdb..'+@temp+''') Is Not NULL Drop Table '+@temp+';   
Create Table '+@temp+' ('+stuff((Select concat(',',quotename(Name),' ',system_type_name) 
                                  From  sys.dm_exec_describe_first_result_set(@SQL,null,null )  A 
                                  Order By column_ordinal
                                  For XML Path ('')),1,1,'') +') 

Insert '+@temp+' '+@SQL+'
'
Exec(@SQL)

Select * from ##myTempTable

【讨论】:

  • 很好。人们只需要希望没有并发发生。答案中的一些警告会很有用。
  • 您提出问题是 100% 正确的。我只是不清楚实际的用例......我最初的想法是发现/元数据
  • @JohnCappelletti 是的,这是发现。我正在学习 SQL Server 的功能,因此感谢任何新知识/提示。
  • @CodeNovice 学习是有趣的部分。我每天都在 SO 上学到新东西
【解决方案2】:

您有多种选择来简化您的任务。但是,这些不会是全自动的。请注意,如果过程代码中有动态 sql,这些将不起作用。您或许可以对函数结果进行格式化,以提高自动化程度,让您轻松复制和粘贴。

SELECT * FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('report.MyStoredProcedureWithAnyColumns'), 0) ;  

SELECT * FROM sys.dm_exec_describe_first_result_set(N'EXEC report.MyStoredProcedureWithAnyColumns', null, 0) ;  

EXEC sp_describe_first_result_set @tsql = N'EXEC report.MyStoredProcedureWithAnyColumns';
GO  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多