我想在SELECT
语句的列定义中内联执行存储过程,类似于:
SELECT n.Name,
n.Key,
(EXEC sp_GetNickname @nameKey = n.NameKey) AS Nickname
FROM Names n
我无权修改存储过程(它来自第三方系统),但我知道它总是只选择一行和一列(它是标量结果)。< / p>
我需要能够内联调用它,因为这个select语句在递归CTE中,如下所示:
WITH Nicknames (Name, Key)
AS
(
SELECT ... -- Base
UNION ALL
SELECT ... -- Recursive
)
还有一个&#34; OUT&#34;如果存储过程的版本更有用,它将按如下方式执行:
EXEC sp_GetNicknameOut @nameKey = n.NameKey,
@outNickname = @theNickname OUTPUT
我无法将任何存储过程或函数添加到数据库中,因为此查询是在动态执行C#应用程序。
我怎样才能做到这一点?
答案 0 :(得分:8)
这不能按要求完成。 您可以在不调用过程的情况下执行递归CTE并将结果保存到临时表中,然后在其上打开游标,然后在游标中执行过程。不好,但我没有看到任何其他方式。
答案 1 :(得分:1)
你不能从一个过程中选择,但你可以做什么,因为你知道从这个过程返回的行数和列数你可以创建一个临时/变量表并插入到那个然后在你里面使用那个临时表或变量表其他声明,
像这样......
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