【问题标题】:Default null values in stored procedures are not Null存储过程中的默认空值不是 Null
【发布时间】:2010-12-01 09:27:57
【问题描述】:

我一直在测试一个错误的过程,我意识到问题是传入的 Null 值没有被默认为过程值......

Create Procedure TestVarcharMaxIsNull
(@myVar varchar(MAX) = '')
as
Select 'Hello' Where @myVar Is Null
Go
Exec TestVarcharMaxIsNull Null
Go
Exec TestVarcharMaxIsNull ''
Go
Exec TestVarcharMaxIsNull 
Go
Drop Procedure TestVarcharMaxIsNull

输出

Run 1 - "hello"
Run 2 - ""
Run 3 - ""

我假设 Null 值默认为存储过程参数中分配的值,但这表明它是否作为参数存在,它采用您传入的值。SQL Server 中是否有可以更改此设置的设置行为?

【问题讨论】:

    标签: sql sql-server stored-procedures null default


    【解决方案1】:

    不,null 值未设置为默认值,因为 null 本身就是 SQL 中变量或字段的有效值。

    为确保参数获得其默认值,请不要传入参数。所以对于你的过程:

    -- @myVar will get default
    EXEC TestVarcharMaxIsNull 
    -- @myVar will be null
    EXEC TestVarcharMaxIsNull @myVar=NULL
    -- @myVar will be "Hello"
    EXEC TestVarcharMaxIsNull @myVar='Hello'
    

    【讨论】:

      【解决方案2】:

      仅当您从过程调用中省略参数时分配的默认值。您可以在过程中测试参数是否为空,并为其分配您想要的默认值。

      declare @var varchar(MAX)
      select @var = ISNULL(@myVAR, '')
      

      【讨论】:

        【解决方案3】:

        空字符串 '' 不等于空值。

        所以你说的地方

        (@myVar varchar(MAX) = '')
        

        意味着当你不传入参数时你会在@myVar中得到一个空字符串,这反过来意味着当你说时

        Where @myVar Is Null
        

        只有当你明确传入一个空参数时才会评估为真,就像在你的第一个测试用例中一样。

        【讨论】:

          猜你喜欢
          • 2010-09-14
          • 2014-04-27
          • 2012-12-14
          • 2015-11-12
          • 2012-08-06
          • 2017-05-07
          • 1970-01-01
          • 1970-01-01
          • 2018-05-09
          相关资源
          最近更新 更多