你能在 T-SQL 中对存储过程的结果进行选择吗

Posted

技术标签:

【中文标题】你能在 T-SQL 中对存储过程的结果进行选择吗【英文标题】:Can you do a select on the results of a stored procedure in T-SQL 【发布时间】:2010-10-18 06:03:08 【问题描述】:
select * from (EXEC sp_SomeStoredProc)

如果您不能这样做,那么是什么阻止了它被添加到 SQL 标准或 T-SQL 中?

【问题讨论】:

可能重复:***.com/questions/209383/… 【参考方案1】:

您不能这样做,但是您可以将其作为插入来进行。例如

insert mytable
exec myStoredProcedure

另外,切勿将存储过程命名为 sp_xxxx。这是因为在查找用户存储过程之前,由于 sp_,SQL 将始终在系统存储过程区域中进行搜索,从而导致性能上的少量损失,这可能会使它在频繁运行的进程中变得相当重要。

【讨论】:

你能不能用“select into”来做这个,然后放下表格? 我不记得您是否可以使用 select into 来执行此操作,但我不这么认为。您需要事先创建完整的表结构 否,但您可以使用#temp 表 如果您将它与临时表一起使用,您需要先创建它并知道列数和列类型。【参考方案2】:

如果存储过程没有返回行怎么办?多个结果集?变化? 存储过程的潜在用途多种多样。

当您拥有SELECT * FROM TableOrView 时,会直接绑定并轻松检查语法和结构。

更准确地说,在关系意义上,存储过程不是关系/表,因此您无法从中进行选择。

用户定义的函数可以实现您想要的,但允许代码符合某些关系/表概念。

【讨论】:

【参考方案3】:

你不能这样做,但你可以考虑在sqlserver2005中的一个函数。这是一个从逗号分隔列表创建表的示例函数

Create Function [dbo].[CsvToInt] ( @Array varchar(1000)) 
returns @IntTable table 
    (IntValue int)
AS
begin

    declare @separator char(1)
    set @separator = ','

    declare @separator_position int 
    declare @array_value varchar(1000) 

    set @array = @array + ','

    while patindex('%,%' , @array) <> 0 
    begin

      select @separator_position =  patindex('%,%' , @array)
      select @array_value = left(@array, @separator_position - 1)

        Insert @IntTable
        Values (Cast(@array_value as int))

      select @array = stuff(@array, 1, @separator_position, '')
    end

    return
end

然后从函数中简单选择...

Select * FROM dbo.CsvToInt('1,2,3,5')

你会得到一个表值。

【讨论】:

【参考方案4】:

这是可能的,但肯定不是正确的方法:

USE test
GO
CREATE procedure dbo.select1 AS
SELECT 1 
GO
EXEC sp_addlinkedserver @server='OQtest', @datasrc='localhost', @provider='SQLNCLI', @srvproduct=''
GO
SELECT * FROM OPENQUERY(OQtest, 'test.dbo.select1')

您可能还需要调整服务器上的安全设置才能使其正常工作。

【讨论】:

【参考方案5】:

您可以使用 ck 描述的方法,但不建议这样做。 您可以查看Erland Sommarskog 的精彩帖子How to Share Data Between Stored Procedures 的INSERT-EXEC 部分了解更多详情。

【讨论】:

以上是关于你能在 T-SQL 中对存储过程的结果进行选择吗的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL分页功能存储过程

重用 t-sql 表变量或克隆其结构

什么选择 EF 与存储过程或 EF 与 T-SQL 语句

用于提供分页结果的SQLServer2000T-SQL存储过程

sqlserver的存储过程

SQL server学习——T-SQL编程之存储过程