2015-12-03 2 views
1

Что я хочу знать, возможно ли как-то сделать обновление для таблицы в выражении Case? Или, если есть какой-то способ сделать это? У меня есть кнопка для вывода отчета (эта кнопка идет и вызывает хранимую процедуру, и она получает список столбцов и их столбцов).Выполнение обновления в SQL с оператором CASE WHEN

Я в принципе хочу, чтобы обновить таблицу, IF, и только тогда, когда DateClosed столбец NULL AND ClosedBy равно нулю (то есть, была достигнута дата окончания, поэтому кампания ЗАКРЫТО).

Как обычно я определяю, закрыта ли кампания, выполняется проверка в начале и конце даты. Т.е. когда EndDate < GetDate() Затем «Закрыто». Таким образом, очевидно, что отображается правильно, но моя база данных отображает нуль, потому что обновления не было.

Это моя хранимая процедура:

ALTER PROCEDURE [dbo].[sp_CampaignStats] 
    @from DATETIME, 
    @to DATETIME 
AS 
    SELECT 
     CampaignName AS 'CAMPAIGN NAME', 
     CampaignDescription AS 'CAMPAIGN DESCRIPTION', 
     CASE 
      WHEN EndDate >= GETDATE() AND StartDate <= GETDATE() THEN 'Active' 
      WHEN StartDate >= GETDATE() THEN 'Pending' 
      WHEN CampaignStatus = 4 THEN 'Archived' 
      ELSE 'Closed' 
     END as 'CurrentStatus', 
     CONVERT(VARCHAR(11), StartDate, 106) + ' - ' + CONVERT(VARCHAR(11), EndDate, 106) AS 'CAMPAIGN DATES', 
     Discount AS 'DISCOUNT', 
     [Target] AS 'TARGET', 
     Uptake AS 'UPTAKE', 
     tc.DateAdded as 'DATE ADDED', 
     U.FirstName + ' ' + u.LastName As 'ADDED BY', 
     CASE 
      WHEN CloseBy IS NULL AND EndDate < GETDATE() AND CloseBy = Null THEN 'System' 
      WHEN CampaignStatus = 4 THEN 'Archived' 
      WHEN CloseBy IS not Null THEN UU.FirstName + ' ' + uu.LastName 
      ELSE 'Not Closed' 
     END AS 'CLOSED BY', 
     DateClosed AS 'DATE CLOSED' 
    FROM 
     Tbl_Campaign tc 
    LEFT JOIN 
     tbl_User U ON Tc.AddedBy = U.UserId 
    LEFT JOIN 
     Tbl_User UU ON TC.CloseBy = UU.UserId 
    WHERE 
     (startDate >= @from OR enddate <= @to) 
     AND CampaignStatus IN (1, 2, 3, 4) 
+0

' CASE' в T-SQL является ** выражением ** (например, 'a + b'), которое возвращает одно атомное значение - оно не используется для« управления потоком »или выполнения блоков кода или чего-либо подобного. –

+0

У вас есть идея, как я мог делать то, что я пытаюсь сделать? Я страдаю. –

+0

Ваш вопрос довольно неясен - у вас есть кнопка * для вывода отчета * - и в следующем предложении вы хотите обновить таблицу? Можете ли вы опубликовать структуру таблицы, о которой идет речь, и объясните более четко (возможно, с указанием некоторого кода), что вы пытаетесь сделать? –

ответ

1

Итак, вы хотите, чтобы обновить таблицу перед темSELECT происходит?

попробовать что-то вроде этого:

UPDATE dbo.Tbl_Campaign 
SET -- what do you want to update to what value here???? 
WHERE 
    DateClosed IS NULL 
    AND ClosedBy IS NULL 

Или что именно вы пытаетесь сделать ?? Вы по-прежнему является довольно неясным и расплывчатым в вашем вопросе - вы не упоминая ЧТО колонку в КОТОРЫХ таблице вы хотите обновить до ЧТО значение, если это условие выполнено .....

+0

Хорошо, думаю, пользователь вытащит отчет. SINCE Dateclosed не всегда обновляется, потому что я использую инструкции LINQ для отображения информации, я часто не использую поле DATE CLOSED. (Вероятно, это была ошибка, но сейчас я слишком глубок). Поэтому, когда они вытаскивают этот отчет, ЕСЛИ поле «Закрытое поле» равно null, ТОГДА просто обновите БД и внесите обновление в GetDate(). Итак UPDATE dbo.Tbl_Campaign SET DateClosed = GetDate() WHERE DateClosed IS NULL AND ClosedBy IS NULL. Извините, я не лучший при описании. –

+0

Тем не менее, вы помогли мне решить мою проблему :) Мне просто пришлось поставить инструкцию Update перед выбором. Я просто не мог понять, КАК вызвать обновление, в выражении select. Очевидно, это было не так, как раньше. –

0

SQL допускает только одну операцию за заявление. SELECT только считывают данные, UPDATE только записывают данные.

Если я понял вашу проблему, у вас есть поле NULL в поле даты окончания, которое мешает вам правильно отображать вашу кнопку? Если это так, то вы могли бы сделать что-то вроде

SELECT 
    StatusDate = 
     CASE WHEN EndDate < GETDATE() THEN 'Closed' 
      WHEN EndDate > GETDATE() THEN 'Open' 
      WHEN EndDate IS NULL THEN 'End Date not set' 
     END 
FROM 
    SourceTable 

Или, если это было проще в вашем коде, оберните СЛУЧАЙ в ISNULL или COALESCE функции, которая может быть использована для заполнения значения по умолчанию.

Ни один из них не обновит таблицу при чтении, но все они остановят NULL, чтобы предотвратить чтение прочитанного вообще.

Видя ваш фактический код сейчас, что вы хотите что-то вроде этого -

ALTER PROCEDURE [dbo].[usp_CampaignStats] 
    @from DATETIME, 
    @to DATETIME 
AS 
    SET NOCOUNT ON; 

    --Make sure any NULLs we need to have been cleaned up 
    UPDATE Tbl_Campaign 
    SET <Fields> 
    WHERE DateClosed IS NULL AND ClosedBy IS NULL 
      AND (startDate >= @from OR enddate <= @to) 
      AND CampaignStatus IN (1, 2, 3, 4); 

    --Now return the data 
    SELECT 
     CampaignName AS 'CAMPAIGN NAME', 
     CampaignDescription AS 'CAMPAIGN DESCRIPTION', 
     CASE 
      WHEN EndDate >= GETDATE() AND StartDate <= GETDATE() THEN 'Active' 
      WHEN StartDate >= GETDATE() THEN 'Pending' 
      WHEN CampaignStatus = 4 THEN 'Archived' 
      ELSE 'Closed' 
     END as 'CurrentStatus', 
     CONVERT(VARCHAR(11), StartDate, 106) + ' - ' + CONVERT(VARCHAR(11), EndDate, 106) AS 'CAMPAIGN DATES', 
     Discount AS 'DISCOUNT', 
     [Target] AS 'TARGET', 
     Uptake AS 'UPTAKE', 
     tc.DateAdded as 'DATE ADDED', 
     U.FirstName + ' ' + u.LastName As 'ADDED BY', 
     CASE 
      WHEN CloseBy IS NULL AND EndDate < GETDATE() AND CloseBy = Null THEN 'System' 
      WHEN CampaignStatus = 4 THEN 'Archived' 
      WHEN CloseBy IS not Null THEN UU.FirstName + ' ' + uu.LastName 
      ELSE 'Not Closed' 
     END AS 'CLOSED BY', 
     DateClosed AS 'DATE CLOSED' 
    FROM 
     Tbl_Campaign tc 
    LEFT JOIN 
     tbl_User U ON Tc.AddedBy = U.UserId 
    LEFT JOIN 
     Tbl_User UU ON TC.CloseBy = UU.UserId 
    WHERE 
     (startDate >= @from OR enddate <= @to) 
     AND CampaignStatus IN (1, 2, 3, 4); 
+0

Эй, извините, я был очень расплывчатым с моим вопросом. Я отредактировал его. –

+0

ОК, последний пример редактируется в соответствии с вашим вопросом. Надеюсь, это поможет :-) – eftpotrm

Смежные вопросы