您可以在T-SQL中选择存储过程的结果吗?

时间:2009-04-08 07:38:44

标签: sql sql-server-2005 stored-procedures

select * from (EXEC sp_SomeStoredProc)

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

5 个答案:

答案 0 :(得分:9)

您无法执行此操作,但您可以将其作为插入执行。 e.g。

insert mytable
exec myStoredProcedure

此外,永远不要将存储过程命名为sp_xxxx。这是因为在查看用户存储过程之前,SQL将始终在系统存储过程区域中搜索sp_,从而导致性能的轻微损失,这可能会使其在经常运行的进程中相当重要。

答案 1 :(得分:2)

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

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')

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

你做不到,但你可以考虑在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 :(得分:1)

您可以使用ck描述的方法,但实际上并不推荐这样做。 您可以INSERT-EXEC查看优秀帖子How to Share Data Between Stored ProceduresErland Sommarskog部分,了解详情。