【问题标题】:T-SQL cast parameter on the fly when calling a stored procedure调用存储过程时动态转换 T-SQL 参数
【发布时间】:2015-03-19 12:52:31
【问题描述】:

为什么是下面的代码

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 语句一起使用,但在调用过程时却不行。

如何用一行代码做到这一点?

谢谢

【问题讨论】:

  • 它在@@ROWCOUNT 和 '30' 附近显示不正确的语法
  • 已经试过了,当然..不行。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

因为在使用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 来将其放入变量中。

【讨论】:

  • 这听起来是一个非常奇怪的设计决定,但无论如何,如果它是这样的......
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2012-09-30
相关资源
最近更新 更多