你能在T-SQL中对存储过程的结果执行选择操作吗?

5
select * from (EXEC sp_SomeStoredProc)

如果你不能做到这一点,那么有什么阻止它被添加到SQL标准或T-SQL中吗?


可能是重复问题:https://dev59.com/OHVC5IYBdhLWcg3wsTfv - Hannele
5个回答

9
您不能这样做,但是您可以将其作为插入操作来执行。例如:
insert mytable
exec myStoredProcedure

另外,永远不要将存储过程命名为sp_xxxx。这是因为SQL会在查找用户存储过程之前先在系统存储过程区域中搜索,导致性能略有损失,在频繁运行的过程中可能会显著增加。


你可以用"select into"这个语句来实现,然后再删除表吗? - Jonathan Parker
我记不清是否可以使用select into来完成这个任务,但我认为不行。你需要事先创建完整的表结构。 - cjk
不行,但你可以使用一个 #temp 表。 - HLGEM
如果您将其与临时表一起使用,则需要先创建它并知道列的数量和类型。 - Donald

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

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

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

你将会得到一个表格值。


1

如果存储过程没有返回任何行,或者有多个结果集或更改会怎样呢?存储过程的潜在用途是多种多样的。

当你使用SELECT * FROM TableOrView时,有一个直接绑定和易于检查的语法和结构。

更正确地说,在关系上下文中,存储过程不是一个关系/表,因此您无法从中选择。

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接