【问题标题】:Create table syntax for stored procedure's return为存储过程的返回创建表语法
【发布时间】:2012-03-06 20:43:15
【问题描述】:

我想知道是否有一种简单的方法可以为存储过程的返回获取创建表语法。

例如我们有一个存储过程:

CREATE PROCEDURE [dbo].[usp_branches]
AS BEGIN
    select * from branches
END

然后我需要这样的东西

insert into @tempBranches
exec usp_branches

有没有一种方法可以轻松地从存储过程的返回中获取创建表语法?所以对于这个例子,我会得到这个

DECLARE @tempBranches TABLE
    (
        BranchID int
        ,BranchName varchar(25)
    )

【问题讨论】:

标签: sql-server sql-server-2008 stored-procedures create-table


【解决方案1】:

在 SQL Server 2012 中,是的。有一个新功能可以根据特定 SQL 字符串或对象名称检索元数据(有关详细信息,请参阅 https://sqlblog.org/2010/12/20/sql-server-v-next-denali-metadata-enhancements)。

在早期版本中(您忘了告诉我们哪个版本),有一些不太可靠的解决方法。例如

SELECT * INTO #table FROM OPENROWSET('SQLNCLI', 
    'Server=(local);Trusted Connection=Yes;', 
    'EXEC yourdatabase.dbo.usp_branches;');

为此,您首先需要说:

EXEC sp_configure 'show adv', 1;
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'ad hoc dist', 1;
RECONFIGURE WITH OVERRIDE;
GO

现在您可以基于tempdb.sys.columns where name LIKE '#table%'; 构建CREATE TABLE 语句。或者更安全的where [object_id] = OBJECT_ID('tempdb..#table');

请记住,就像新的元数据功能一样,如果有多个结果集(或者形状可能会根据输入而改变),那么所有的赌注都会被取消。

【讨论】:

  • @DenisValeev 谢谢,坦率地说,我认为这是一个糟糕的解决方案(应该有更好的方法来检索结果元数据),但它确实是一种流行的解决方法。 :-)
  • 我只需进入存储过程并编辑最终选择以将其输出到临时表中,然后可以编写脚本以获取元数据。对于名称很难拼写的大型表来说尤其如此。
  • 它适用于 2008 年,但由于安全设置,我可以在服务器上试用它。 'SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问,因为该组件作为此服务器的安全配置的一部分已关闭。系统管理员可以使用 sp_configure 启用“即席分布式查询”。有关启用“即席分布式查询”的详细信息,请参阅 SQL Server 联机丛书中的“表面区域配置”。
  • @DenisValeev 好吧,这并不是一个真正“更好”的解决方案——意思是我认为 SQL Server 团队可以提供的解决方案,而不是我们自己拼凑的解决方案。
  • @Denis,什么是临时表?
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多