【问题标题】:SQL Select Statement including SP Call has syntax error包括 SP 调用的 SQL Select 语句有语法错误
【发布时间】:2011-06-10 12:40:23
【问题描述】:

MYTABLE 有 ID 列。但是,以下查询会产生语法错误。

SELECT ID FROM MYTABLE
WHERE ID = EXEC MY_SP ID

你认为这里有什么问题?

【问题讨论】:

    标签: sql sql-server sql-server-2005 stored-procedures return-value


    【解决方案1】:

    试试这个:

    SELECT ID FROM MYTABLE WHERE ID = @@SPID
    

    【讨论】:

      【解决方案2】:

      我认为你根本做不到。您是否正在考虑用户定义函数而不是存储过程。根据上下文,您需要一个标量 UDF。

      【讨论】:

        【解决方案3】:

        你不能像这样内联调用存储过程。

        几个选项包括: 1)执行存储过程并将结果存储在临时表中。然后使用该临时表。 例如

        CREATE TABLE #Example
        (
        ID INTEGER
        )
        INSERT #Example
        EXECUTE My_SP
        
        SELECT t.ID FROM MyTable t JOIN #Example e ON t.ID = e.ID
        DROP TABLE #Example
        

        2) 将存储过程转换为用户定义的函数,您可以调用该函数内联 例如

        CREATE FUNCTION dbo.MyFunc()
            RETURNS TABLE
        AS
        RETURN
        (
            SELECT ID FROM SomeTable WHERE ....
        )
        
        SELECT t.ID FROM MyTable t JOIN dbo.MyFunc() f ON t.ID = f.ID
        

        3) 如果 sproc 返回单个 ID,请考虑从 sproc 返回一个 OUTPUT 参数,并像这样使用:

        DECLARE @ID INTEGER
        EXECUTE MY_SP @ID OUTPUT
        
        SELECT ID FROM MYTABLE
        WHERE ID = @ID
        

        【讨论】:

        • 这么简单的需求有这么复杂的解决方案吗?
        • @user544433 - 是的,您不能像您尝试的那样内联调用存储过程。您选择哪种解决方案实际上取决于您的具体情况。例如您可能无法使用用户定义的函数,具体取决于您当前的 sproc 所做的事情(您不能在函数中执行您可以在 sproc 中执行的所有操作,但您可以内联调用函数)
        • 我将存储过程更改为 UDF。但是现在我有另一个问题是:只有函数和扩展存储过程才能从函数内部执行。这意味着,我在 UDF 中进行的 sproc 调用是非法的。所以它崩溃了我所有的解决方案
        • 您可以在存储过程中执行某些在 UDF 中无法执行的操作(例如,以创建临时表为例)。因此,我上面关于您的评论可能无法使用 UDF,具体取决于您的 sproc 的功能。在这种情况下,选项 1) 使用临时表将是最佳选择。
        【解决方案4】:

        我觉得你不需要exec语句,调用sp就行了,exec应该是单独的语句

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-21
          • 1970-01-01
          • 2019-08-24
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-07
          相关资源
          最近更新 更多