【问题标题】:Stored procedure with named parameter and calculation具有命名参数和计算的存储过程
【发布时间】:2016-10-21 04:39:43
【问题描述】:

我正在使用命名参数调用存储过程。

exec MySP @name = 'binesh', @amount = @amt, @date = @date

对我来说效果很好。

但是当我尝试的时候

exec MySP2 @name = 'binesh', @amount = -@amt, @date = @date

exec MySP3 @name = 'binesh', @amount = @amt, @date = convert(varchar(25), @date, 131)

我收到语法错误。

这是强制性的,我需要为每个变量创建单独的变量(常识告诉它不会这样)。那么这个的语法是什么?

谢谢大家

比尼什

【问题讨论】:

  • 您遇到的语法错误是什么?每个 sp 中的变量是如何声明的?
  • 如果您收到 -1000 错误,可能是因为您的查询由于输入以外的其他原因无法处理负数。
  • 我在这样的查询窗口中调用。它不是-1000。它的-@amt。对不起。更新问题
  • 在这种情况下,@amt 示例的问题是您不能在参数中使用 +/-(一元运算符)。所以是的,你需要一个单独的变量。 '-1000' 和 '-@variable' 的区别在于 -1000 不执行操作,它只是一个数字。

标签: sql-server database tsql stored-procedures named-parameters


【解决方案1】:

您不能为存储过程构造“内联”输入。您必须先解析输入,然后才能使用它们。

例如,您需要做这样的事情(以及解析其他参数)...

declare
    @date varchar(25) = convert(varchar(25), @date, 131);

exec MySP3 @name = 'binesh', @amount = @amt, @date = @date;

【讨论】:

    【解决方案2】:

    我认为由于过程数据类型,您不能这样做。我猜@amount 在过程参数中是 int 和 @date varchar(25)。如果@date 是varchar 你不能直接输入@date=convert(varchar(25),@date,131)。使用相同类型的变量进行转换。我的建议是

    declare @amt INT= 100; --some value
    set @amt = @amt * -1;
    declare @date DATE = getdate(); -- some date
    declare @date2 VARCHAR(25);
    set @date2 = convert(varchar(25),@date,131); --convert to varchar
    exec MySP3 @name='binesh', @amount = @amt,@date=@date2
    

    【讨论】:

    • sp 中的日期仅是 varchar 类型,并且 -amt 在任何情况下都应该接受,对吗?
    • 是的,您可以像这样使用局部变量进行调整 declare @amt INT= 100;设置 [@amt] = [@amt] * -1
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多