如何在select查询中执行存储过程

Joa*_*kim 41 sql sql-server stored-procedures sql-server-2008

SELECT col1,
       col2,
       col3,

EXEC GetAIntFromStoredProc(T.col1) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 
Run Code Online (Sandbox Code Playgroud)

如何在SQL Server 2008中编写此SQL查询?

Joa*_*kim 41

谢谢@twoleggedhorse.

这是解决方案.

  1. 首先我们创建了一个函数

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER
    
    AS
    BEGIN
       DECLARE @id INTEGER
    
       set @id= (select TOP(1) id From tbl where col=@parm)
    
       RETURN @id
    END
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后我们做选择查询

    Select col1, col2, col3,
    GetAIntFromStoredProc(T.col1) As col4
    From Tbl as T
    Where col2=@parm
    
    Run Code Online (Sandbox Code Playgroud)

  • 究竟.正确的答案应该是"不可能的". (23认同)
  • 这不是对程序提出的字面问题的答案.这是一个具有巨大局限性的替代解决方案.看我的实际答案. (3认同)
  • 这如何解决您刚刚将存储过程转换为函数的问题:/ (3认同)
  • 如果存储过程需要执行动态查询怎么办?它不会与功能一起使用。 (3认同)

Buv*_*inJ 32

函数很容易在select循环中调用,但它们不允许您运行插入,更新,删除等.它们仅对查询操作有用.您需要一个存储过程来操作数据.

因此,这个问题的真正答案是你必须通过"游标"迭代select语句的结果,并从该循环中调用该过程.这是一个例子:

DECLARE @myId int;
DECLARE @myName nvarchar(60);
DECLARE myCursor CURSOR FORWARD_ONLY FOR
    SELECT Id, Name FROM SomeTable;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId, @myName;
WHILE @@FETCH_STATUS = 0 BEGIN
    EXECUTE dbo.myCustomProcedure @myId, @myName;
    FETCH NEXT FROM myCursor INTO @myId, @myName;
END;
CLOSE myCursor;
DEALLOCATE myCursor;
Run Code Online (Sandbox Code Playgroud)

请注意,这@@FETCH_STATUS是一个为您更新的标准变量.这里的其余对象名称是自定义的.


小智 7

“不可能”。您可以使用函数代替存储过程。


bd3*_*d33 5

只要您不在存储过程中执行任何INSERT或UPDATE语句,您就可能希望使其成为函数。

存储过程是由外部程序执行的,或者是按一定时间间隔执行的。

这里的答案将比我能更好地解释它:

SQL Server中的功能与存储过程

  • 存储过程可以用于“由外部程序执行,或按时间间隔执行。”,但它们绝不限于此,或仅用于这些目的。脚本一直在编写,以便在独立的、按需上下文中运行以进行数据操作。 (2认同)

Ste*_*son 5

您可以创建一个与您的 proc 输出匹配的临时表并插入其中。

CREATE TABLE #Temp (
    Col1 INT
)

INSERT INTO #Temp
    EXEC MyProc
Run Code Online (Sandbox Code Playgroud)