调用存储过程时动态调用T-SQL

时间:2015-03-19 12:52:32

标签: sql sql-server tsql stored-procedures

为什么以下代码

DECLARE @LogDetail AS NVARCHAR(1000)
SELECT @LogDetail = CAST(@@ROWCOUNT AS NVARCHAR(30)) + ' rows processed'
EXECUTE MyProcedure @ExecutionId, @LogDetail

有效,但这不是吗?

EXECUTE MyProcedure @ExecutionId, CAST(@@ROWCOUNT AS NVARCHAR(30)) + ' rows processed'

很奇怪,因为动态生成的值使用INSERT语句,但在调用过程时则不行。

如何使用单行代码进行操作?

由于

1 个答案:

答案 0 :(得分:9)

因为在使用EXEC时必须使用变量表达式不是一个选项。

-- SQL Server Syntax

Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH <execute_option> [ ,...n ] ]
    }
[;]

而且,既然你提到了INSERT,我们就可以看一下它,看看它是否明确提到了表达式:

[ WITH <common_table_expression> [ ,...n ] ]
INSERT 
{
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] 
        { <object> | rowset_function_limited 
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
        }
    {
        [ ( column_list ) ] 
        [ <OUTPUT Clause> ]
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ] 
        | derived_table 
        | execute_statement
        | <dml_table_source>
        | DEFAULT VALUES 
        }
    }
}
[;]
  

如何使用单行代码进行操作?

听起来很奇怪,你不能。如果要构造要传递给存储过程的信息,则必须将其作为单独的SET / SELECT进行,以将其转换为变量。