开发者

SQL Stored Procedure IF Statements not catching nulls and proper conditions

开发者 https://www.devze.com 2023-03-18 12:34 出处:网络
The stored procedure below isn\'t catching the proper conditions. If I submit both images, it writes both images properly.If I upload 1 image and leave one blank, it saves the blank as null overwritin

The stored procedure below isn't catching the proper conditions. If I submit both images, it writes both images properly. If I upload 1 image and leave one blank, it saves the blank as null overwriting the existing data. And finally, if I leave both blank, it saves both blank overwriting the existing data. Any help would be great. Thanks.

STORED PROC

ALTER PROCEDURE fstage.spUpdateCMSTrendLanding

(
@TrendLandingText nvarchar(max),
@TrendGuideLandingImage1 nvarchar(max),
@TrendGuideLandingImage2 nvarchar(max)

)

AS
BEGIN

SET NOCOUNT ON;

IF @TrendGuideLandingImage1 IS NULL AND @TrendGuideLandingImage2 IS NULL
    BEGIN
        UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText;
    END

If (@T开发者_JS百科rendGuideLandingImage1 IS NOT NULL) AND (@TrendGuideLandingImage2 IS NOT NULL) 
    BEGIN
        UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText, TrendGuideLandingImage1=@TrendGuideLandingImage1, TrendGuideLandingImage2=@TrendGuideLandingImage2;
    END

If (@TrendGuideLandingImage1 IS NOT NULL) AND (@TrendGuideLandingImage2 IS NULL)
    BEGIN
        UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText, TrendGuideLandingImage1=@TrendGuideLandingImage1;
    END

If (@TrendGuideLandingImage2 IS NOT NULL) AND (@TrendGuideLandingImage1 IS NULL)
    BEGIN
        UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText, TrendGuideLandingImage2=@TrendGuideLandingImage2;
    END

END


Your NULLs are empty strings. Not database NULL values. Empty string is a value.

This means the code always uses the same condition

Add this at the top of the proc:

SELECT 
  @TrendGuideLandingImage1 = NULLIF(@TrendGuideLandingImage1, ''),
  @TrendGuideLandingImage2 = NULLIF(@TrendGuideLandingImage2, '')

Or add defaults and don't set the parameter in client code

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


Try doing it with ISNull

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


You can rewrite your procedure as a single UPDATE statement using NULLIF and ISNULL.

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)
0

精彩评论

暂无评论...
验证码 换一张
取 消