【问题标题】:SQL Server : Select Local Variable After Some ProcessSQL Server:在某些过程后选择局部变量
【发布时间】:2014-11-07 09:04:39
【问题描述】:
CREATE PROCEDURE dbo.test2
AS
BEGIN
    DECLARE @status as int
    DECLARE @error as int
    SET @status = 1
    SET @Error = @@ERROR   
        UPDATE dbo.BView
        SET bview='dar'
        WHERE pt='foo'

    IF @Error > 0
        print 'ERROR'
    else
        SELECT @status as 'status'
END;

为什么这个查询总是返回局部变量@status的默认值而不管分配给它什么?

status
------
0

服务器版本:MS SQL Server 2014 Express

【问题讨论】:

  • 我没有听说过有默认值的变量。如果你没有初始化变量,那么你会得到NULL!!
  • 默认值为1后你分配了什么?
  • 预期结果是什么。
  • 您使用的是什么版本的 SQL Server?在 SQL Server 2008 ... 之前,使用 DECLARE 语句的隐式初始化不可用
  • 无法重现 - 按预期输出 1 ....(在 SQL Server 2012 开发人员版上)

标签: sql-server local-variables


【解决方案1】:

在 sql server 2005 中:在你的 sql server 中运行。

您不能在声明时指定默认值。

并在命令中发布结果。

DECLARE @status int
SET  @status = 1
SELECT @status as 'status'

【讨论】:

  • 上述答案有什么不同?
  • 我认为这是你所期望的。
  • 所以你说DECLARE @status int=1;DECLARE @status int SET @status = 1; 是不同的!!
  • 当然。你不能在声明部分赋值。
  • 是的,这是我所期望的,但是当我的问题中存在一些其他代码(如更新或插入语句)时,准确度就不一样了。
【解决方案2】:

建议。虽然找不出什么毛病,但还是按正常的方式去做吧。

始终在更新、插入或任何操作之前先声明变量。

 CREATE PROCEDURE dbo.sp_test2
    AS
    BEGIN
    DECLARE @status as int
    SET @status = 1   
        UPDATE dbo.BView
        SET bview='dar'
        WHERE pt='foo'

    SELECT @status as 'status'
    END

第二始终使用关键字AS,然后是变量类型,然后是大小。如果你不跟随变量大小,它大多返回 0,主要注意 nvarchar 类型/varchar 类型。示例

 DECLARE @status as nvarchar

当对长度为 20 的字符串使用时,通常返回 0。其中,

 Declare @status as nvacrhar(20)

工作正常。

您的更新/插入等过程中可能存在错误,我可以看到您将声明和选择过程放在同一个节点中(即开始和结束)。您可以检查类似的错误。

CREATE PROCEDURE dbo.sp_test2
    AS
    BEGIN
    DECLARE @status as int
    DECLARE @error as int
    SET @status = 1
    SET @Error = @@ERROR
        --Some statement, update or insert, let's say:
        UPDATE dbo.BView
        SET bview='dar'
        WHERE pt='foo'

IF @Error > 0
   print 'ERROR'
else
    SELECT @status as 'status'

END

这些都是建议,但我经常这样做,但它从来没有让我失望。为了更好地理解 SQL Here 中的变量。在 MSSql here 中引发错误等等。希望对您有所帮助。

【讨论】:

  • 非常感谢您的宝贵建议,我已经执行了您的代码结果是@status=0 并且没有返回错误:(
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 2019-06-14
  • 2010-12-03
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多