Хранимая процедура SQL, если операторы не перехватывают значения NULL и соответствуют - PullRequest
0 голосов
/ 06 июля 2011

Хранимая процедура ниже не соответствует нужным условиям.Если я отправляю оба изображения, он записывает оба изображения правильно.Если я загружаю 1 изображение и оставляю одно пустое, оно сохраняет пустое значение, перезаписывая существующие данные.И, наконец, если я оставлю оба поля пустыми, они сохранят оба поля поверх существующих данных.Любая помощь будет отличной.Спасибо.

ХРАНЕННЫЙ ПРОЦЕСС

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 (@TrendGuideLandingImage1 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

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Ваши NULL являются пустыми строками.Не значения базы данных NULL.Пустая строка - это значение.

Это означает, что код всегда использует одно и то же условие

Добавьте это в начало процедуры:

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

Или добавьте значения по умолчанию и donне устанавливать параметр в коде клиента

ALTER PROCEDURE fstage.spUpdateCMSTrendLanding
    @TrendLandingText nvarchar(max),
    @TrendGuideLandingImage1 nvarchar(max) = NULL,
    @TrendGuideLandingImage2 nvarchar(max) = NULL
AS
1 голос
/ 06 июля 2011

Попробуйте сделать это с ISNull

IF IsNull(@TrendGuideLandingImage1,"") AND IsNull(@TrendGuideLandingImage2,"") =""
  BEGIN
    UPDATE fstage.staticCMS SET TrendGuideLanding = @TrendLandingText;
  END
0 голосов
/ 06 июля 2011

Вы можете переписать вашу процедуру как один оператор UPDATE, используя NULLIF и 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...