【问题标题】:TSQL Issue with NULLIF and 0 conversionNULLIF 和 0 转换的 TSQL 问题
【发布时间】:2016-03-22 23:26:35
【问题描述】:

我遇到了一个小问题,让我有些悲伤。在我看来合乎逻辑的事情对我不利。

我允许用户“批量更新”记录并赋予他们更改一条数据或全部数据的能力。

如果用户在totalLeaders 字段中输入整数,例如 1,它会很好地更新值。

如果用户将该字段留空,它会将其转换为 null 并跳过该更新而保留其当前值。

但是,如果我在该字段中传递0 表示不会训练任何领导者,它会说它是一个空值并且不执行IF 语句。

我希望<totalLeaders>0</totalLeaders> 不会被视为空值并执行IF 语句。我还希望 <totalLeaders></totalLeaders> 被视为 NULL 值,NOT 执行 IF 语句。

有什么想法吗??

DECLARE @totalTrainingTime INT;
DECLARE @totalTeammates INT;
DECLARE @totalLeaders INT;
DECLARE @xml XML = '<root><data><totalLeaders>0</totalLeaders><totalTeammates>2</totalTeammates><totalTrainingTime>12</totalTrainingTime></data></root>';

-- Set our variables
SELECT @totalTrainingTime = NULLIF(ParamValues.x1.value('totalTrainingTime[1]', 'INT'), ''),
       @totalTeammates = NULLIF(ParamValues.x1.value('totalTeammates[1]', 'INT'), ''),
       @totalLeaders = NULLIF(ParamValues.x1.value('totalLeaders[1]', 'INT'), '')
FROM   @xml.nodes('/root/data') AS ParamValues(x1);

-- Test
SELECT @totalLeaders AS leaders,
       @totalTeammates AS teammates,
       @totalTrainingTime AS trainingTime

--Do we have leaders?
IF (@totalLeaders IS NOT NULL)
BEGIN
    SELECT 'Lets update the leaders because we were given a value'
END
ELSE
BEGIN
    SELECT 'We did not update leaders because it was a NULL value... However, it was really 0 that was passed'
END

--Do we have teammates?
IF (@totalTeammates IS NOT NULL)
BEGIN
    SELECT 'Lets update the teammates because we have a value'
END

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-server-2012


    【解决方案1】:

    试试这个:
    NULLIF(ParamValues.x1.value('totalLeaders[1]/text()[1]', 'INT'),0)

    【讨论】:

    • 我不希望将值设置为0如果是NULL
    • 这会将值设置为 NULL 如果它是 0 而不是相反。如果是NULL,它将保持NULL
    【解决方案2】:

    我不完全确定为什么零值会显示为NULL,但一种选择可能是先转换为VARCHAR:

    @totalLeaders = CONVERT(INT, NULLIF(ParamValues.TaskChainerTask.query('Property1').value('totalLeaders[1]', 'VARCHAR(5)'),''))
    

    请查看this SO link了解更多信息。

    【讨论】:

      【解决方案3】:

      如果需要,将它作为VARCHAR 获取,然后以CONVERT 获取它

      @totalLeaders = NULLIF(ParamValues.x1.value('totalLeaders[1]', 'varchar(50)'), '')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 2012-04-24
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多