Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在SELECT语句中内联使用存储过程的结果_Sql_Sql Server_Stored Procedures_Common Table Expression - Fatal编程技术网

Sql 在SELECT语句中内联使用存储过程的结果

Sql 在SELECT语句中内联使用存储过程的结果,sql,sql-server,stored-procedures,common-table-expression,Sql,Sql Server,Stored Procedures,Common Table Expression,我希望在SELECT语句的列定义中内联执行一个存储过程,类似于以下内容: SELECT n.Name, n.Key, (EXEC sp_GetNickname @nameKey = n.NameKey) AS Nickname FROM Names n 我无权修改来自第三方系统的存储过程,但我知道它总是只选择一行和一列,这是一个标量结果 我需要能够内联调用它,因为此select语句位于递归CTE中,类似于: WITH Nicknames (Name, Key) AS

我希望在SELECT语句的列定义中内联执行一个存储过程,类似于以下内容:

SELECT n.Name,
       n.Key,
       (EXEC sp_GetNickname @nameKey = n.NameKey) AS Nickname
FROM Names n
我无权修改来自第三方系统的存储过程,但我知道它总是只选择一行和一列,这是一个标量结果

我需要能够内联调用它,因为此select语句位于递归CTE中,类似于:

WITH Nicknames (Name, Key)
AS
(
    SELECT ... -- Base
    UNION ALL
    SELECT ... -- Recursive
)
还有一个OUT版本的存储过程,如果它更有用,那么它将按如下方式执行:

EXEC sp_GetNicknameOut @nameKey = n.NameKey,
                       @outNickname = @theNickname OUTPUT
我无法向数据库添加任何存储过程或函数,因为此查询是从C应用程序动态执行的


如何实现这一点?

您不能从过程中进行选择,但您可以做什么,因为您知道此过程返回的行数和列数,您可以创建一个临时/变量表并插入其中,然后在其他语句中使用该临时表或变量表

像这样的

CREATE TABLE #Temp(ColName DataType)

INSERT INTO  #Temp(ColName)
EXEC sp_GetNickname @nameKey = 'value'
现在可以在SELECT语句中使用此值

SELECT n.Name,
       n.Key,
       (SELECT ColName FROM #Temp) AS Nickname
FROM Names n

无法按要求执行此操作。
您可以执行递归CTE,而无需调用该过程,并将结果保存到临时表中,然后在其上打开一个游标,然后在游标中执行一个过程。不太好,但我看不出其他方法。

不能从select中调用存储过程。您可以单独调用它,将值分配给变量,然后在选择中使用该变量。如果可以将SP更改为函数,则可以根据需要在查询中使用它。您有权查看存储过程代码吗?如果是这样的话,我会按照@Hamlet的建议去做。我不能修改或创建任何存储过程,这段代码是从C应用程序动态执行的,我们不能在数据库中安装任何东西。看起来这是不可能做到的…在递归CTE中如何做到这一点?这需要在CTE中工作,为SELECT语句的每一行执行一次存储过程。我想这就是我必须要做的。我也看不出有别的办法。谢谢不是我的。这是一个正确的答案,也是一个很好的替代建议,所以我不知道。因为你投了反对票,所以我决定用赞成票来反驳,因为这对我来说也是一个有用的答案。我猜落选的选民对没有解决方案感到不高兴。你也可以将交叉应用与UDF结合使用,而不是cursor@SilentSojourner阅读问题。“我不能向数据库中添加任何存储过程或函数,”OP说。