在T-SQL中执行标量函数

3

如何在T-SQL中执行标量查询的等效操作?换句话说,使用SQL,当我调用存储过程时,如何获取第一个结果集的第一行的第一列?

编辑: 仅使用SQL语言,不涉及客户端语言。结果集可能是这样的:

Id Description
--------------
1  foo
2  bar

我只想在一个变量中保存“1”。

我知道的唯一方法是使用临时表(未经测试,但您可以理解):

INSERT #TempTable EXEC MyStoredProcedure

DECLARE @id INT;

SELECT TOP(1) @id = Id FROM #TempTable

+1 因为你的问题,我学到了新东西!=) - Will Marcouiller
3个回答

1

你的临时表解决方案可能是唯一的选择。

SQL并不是真正为此而设计的。


0
如果您在谈论 .net 客户端,则可以使用 SQLCommand.ExecuteScalar。
如果不是,请提供一个完全适合您情况的示例。
编辑: 您可以这样做,因为您提供了额外的信息:
-- add 'loopback' linkedserver 
if exists (select * from master..sysservers where srvname = 'loopback')
 exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback',
 @srvproduct = N'',
 @provider = N'SQLOLEDB', 
 @datasrc = @@servername
go

select top 1 * @id = id 
from openquery(loopback, 'exec MyStoredProcedure') 
go

然而,这远非理想,而且您必须启用即席查询才能使其正常工作


这真的是一个我不会最终使用的黑客技巧,但它证明了许多限制可以通过更多的间接性来克服。 :) - Nelson Rothermel

0

从你的问题描述中,这是我能想到的唯一方法。=)

选择dbo.MyStoredProcedure返回的第一个列名为nameOfFirstColumnReturnedBySP的列作为Column1

编辑 #1

-- Assuming this temporary table represents the data structure returned by the SP.
CREATE TABLE @Data (
    Column1 int
    , Column2 nvarchar(10)
)

insert into @Data
    exec dbo.MyStoredProcudure

select TOP 1 Column1
    from @Data

相关链接:存储过程:返回数据

希望这能帮到你!=)


你不能在SQL Server中这样做。你不能像那样从存储过程中进行选择操作。 - Mladen Prajdic
@Mladen Prajdic: 你说得对!我本来就以为我在哪里见过它。谢谢您的评论,这促使我进一步搜索并找到了解决方法。 - Will Marcouiller
说实话,有一个变通方法,就是在服务器本身上添加一个回环服务器,并在其上运行带有exec sproc的openquery。 - Mladen Prajdic
如果你看到这样的东西,那很可能是一个用户定义的函数返回了一个表格。 - Nelson Rothermel

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