SQL存储过程IF语句未捕获空值和正确条件

SQL存储过程IF语句未捕获空值和正确条件,sql,stored-procedures,Sql,Stored Procedures,下面的存储过程未捕获正确的条件。如果我提交两个图像,它会正确地写入两个图像。如果我上传1个图像并留下一个空白,它将空白保存为覆盖现有数据的空白。最后,如果我将这两个都保留为空,它会将这两个都保存为空,覆盖现有数据。任何帮助都会很好。谢谢 存储过程 你的空字符串。不是数据库空值。空字符串是一个值 这意味着代码总是使用相同的条件 在程序顶部添加以下内容: SELECT @TrendGuideLandingImage1 = NULLIF(@TrendGuideLandingImage1, '')

下面的存储过程未捕获正确的条件。如果我提交两个图像,它会正确地写入两个图像。如果我上传1个图像并留下一个空白,它将空白保存为覆盖现有数据的空白。最后,如果我将这两个都保留为空,它会将这两个都保存为空,覆盖现有数据。任何帮助都会很好。谢谢

存储过程
你的空字符串。不是数据库空值。空字符串是一个值

这意味着代码总是使用相同的条件

在程序顶部添加以下内容:

SELECT 
  @TrendGuideLandingImage1 = NULLIF(@TrendGuideLandingImage1, ''),
  @TrendGuideLandingImage2 = NULLIF(@TrendGuideLandingImage2, '')
或者添加默认值,不在客户端代码中设置参数

ALTER PROCEDURE fstage.spUpdateCMSTrendLanding
    @TrendLandingText nvarchar(max),
    @TrendGuideLandingImage1 nvarchar(max) = NULL,
    @TrendGuideLandingImage2 nvarchar(max) = NULL
AS

你的空字符串。不是数据库空值。空字符串是一个值

这意味着代码总是使用相同的条件

在程序顶部添加以下内容:

SELECT 
  @TrendGuideLandingImage1 = NULLIF(@TrendGuideLandingImage1, ''),
  @TrendGuideLandingImage2 = NULLIF(@TrendGuideLandingImage2, '')
或者添加默认值,不在客户端代码中设置参数

ALTER PROCEDURE fstage.spUpdateCMSTrendLanding
    @TrendLandingText nvarchar(max),
    @TrendGuideLandingImage1 nvarchar(max) = NULL,
    @TrendGuideLandingImage2 nvarchar(max) = NULL
AS

尝试使用ISNull执行此操作

IF IsNull(@TrendGuideLandingImage1,"") AND IsNull(@TrendGuideLandingImage2,"") =""
  BEGIN
    UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText;
  END

尝试使用ISNull执行此操作

IF IsNull(@TrendGuideLandingImage1,"") AND IsNull(@TrendGuideLandingImage2,"") =""
  BEGIN
    UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText;
  END

您可以使用
NULLIF
ISNULL
将过程重写为单个
UPDATE
语句

CREATE PROCEDURE fstage.spUpdateCMSTrendLanding
(
    @TrendLandingText nvarchar(max),
    @TrendGuideLandingImage1 nvarchar(max),
    @TrendGuideLandingImage2 nvarchar(max)
)
AS
    UPDATE fstage.staticCMS
    SET TrendGuideLanding = @TrendLandingText
    ,TrendGuideLandingImage1
        = ISNULL(NULLIF(@TrendGuideLandingImage1, ''), TrendGuideLandingImage1)
    ,  TrendGuideLandingImage2
        = ISNULL(NULLIF(@TrendGuideLandingImage2, ''), TrendGuideLandingImage2)

您可以使用
NULLIF
ISNULL
将过程重写为单个
UPDATE
语句

CREATE PROCEDURE fstage.spUpdateCMSTrendLanding
(
    @TrendLandingText nvarchar(max),
    @TrendGuideLandingImage1 nvarchar(max),
    @TrendGuideLandingImage2 nvarchar(max)
)
AS
    UPDATE fstage.staticCMS
    SET TrendGuideLanding = @TrendLandingText
    ,TrendGuideLandingImage1
        = ISNULL(NULLIF(@TrendGuideLandingImage1, ''), TrendGuideLandingImage1)
    ,  TrendGuideLandingImage2
        = ISNULL(NULLIF(@TrendGuideLandingImage2, ''), TrendGuideLandingImage2)

工作得很好!(过程解决方案顶部)。非常感谢你!工作得很好!(过程解决方案顶部)。非常感谢你!谢谢你抽出时间。谢谢你的帮助,谢谢你抽出时间。感谢您的帮助。这将是对LOB列的虚拟更新,可能会很昂贵:如果两个图像都为空,则为2个LOB列。如果不是LOB,那么是的,但在这种情况下最好不要太多,这将是对LOB列的虚拟更新,这可能会很昂贵:或者如果两个图像都为空,则会对两个LOB列进行虚拟更新。如果不是LOB,那么是的,但在这种情况下最好不要太高