SQL Server 2005 условное обновление поля - PullRequest
1 голос
/ 02 декабря 2010

У меня есть SQL ниже, и я хочу обновить managerNTID с @managerNTID только в том случае, если запись БД пользователя имеет значение StopManagerOverride 0, если для записи установлено значение 1, тогда я не хочуобновить это поле:

UPDATE ee
SET 
    MangerId        = CASE ee.ShopManagerOverride
                            WHEN 0 THEN @MangerId
                            ELSE ee.MangerId
                          END
    ,ManagerNTID        = CASE ee.ShopManagerOverride
                            WHEN 0 THEN @managerNTID
                            ELSE ee.ManagerNTID
                          END
    ,NTID               = @NTID
    ,FirstName          = @FirstName
    ,LastName           = @LastName
    ,FullName           = @FullName
    ,ReportingGroup     = @ReportingGroup
    ,DistinguishedName  = @DistinguishedName
    ,IsActive           = 1
    --,StopManagerOverride= 1
    ,LastUpdate         = GETDATE()
    ,UpdateBy           = @UpdateBy
FROM dbo.Employees ee
    Inner Join dbo.Employees e ON e.NTID = ee.NTID
WHERE ee.NTID = @NTID

Мысли о том, как сделать это одно поле в обновлении встроенным условием?

edit: я почти на месте, просто нужно разрешить некоторые неоднозначные столбцы,мои глаза уже красные от этого.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2010

Вы можете попробовать что-то вроде этого - если ShopManagerOverride установлен в 1, обновите его до значения параметра, переданного в, в противном случае обновите его до значения, которое он уже имеет (я также предполагаю, что ваше поле действительно ManagerId - нет MangerId - верно ??):

UPDATE 
    dbo.Employees
SET 
    ManagerId = @ManagerId,
    ManagerNTID = CASE e.ShopManagerOverride
                     WHEN 1 THEN @managerNTID
                     ELSE e.ManagerNTID
                  END,
    NTID = @NTID,
    FirstName = @FirstName,
    LastName = @LastName,
    FullName = @FullName,
    ReportingGroup = @ReportingGroup,
    DistinguishedName = @DistinguishedName,
    IsActive = 1,
    LastUpdate = GETDATE(),
    UpdateBy = @UpdateBy
FROM
    dbo.Employees e 
WHERE 
    e.NTID = dbo.Employees.NTID
    AND dbo.Employees.NTID = @NTID

Непроверенная, прямая и «свободная рука» от моего мозга - надеюсь, я правильно понял синтаксис! Попробуйте - это работает, это делает то, что вы ищете ??

0 голосов
/ 03 декабря 2010

Другой способ -

 If StopManagerOverride = 0
 Begin
 Set @ManagerNTID = Select Existing Value of the row
 END

THen Продолжите с нормальным оператором обновления

0 голосов
/ 02 декабря 2010

Мне было интересно, как это сделать тоже.Я видел заявления Case, но я не знаю, сработает ли это в этой ситуации.В прошлом я делал это с помощью функции копирования и вставки, а затем пошел такв

UPDATE Employees
SET 
     MangerId           = @MangerId
    ,ManagerNTID        = @managerNTID
    ,NTID               = @NTID
    ,FirstName          = @FirstName
    ,LastName           = @LastName
    ,FullName           = @FullName
    ,ReportingGroup     = @ReportingGroup
    ,DistinguishedName  = @DistinguishedName
    ,IsActive           = 1
    ,StopManagerOverride= CASE Conditional WHEN True THEN (value to set it to)
     ELSE (pre existing value of the row) END;

    ,LastUpdate         = GETDATE()
    ,UpdateBy           = @UpdateBy
WHERE NTID = @NTID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...