SQL Server 2008: выберите, а затем обновите оператор - PullRequest
1 голос
/ 03 мая 2011

Я делаю ВНУТРЕННЕЕ СОЕДИНЕНИЕ по 6 таблицам для модуля для моего приложения, в основном он берет, что prostaff an получает свое имя и адрес электронной почты, и сравнивает это со списком соискателей.

В mod_employmentAppJobs мне нужно установить столбец для каждой выбранной строки в значение true. В основном это устанавливает флаг, который говорит sql не выбирать столбец, потому что мы уже отправили письмо этому пользователю. Это битовое поле.

Как мне установить для поля emailSent значение true в инструкции SQL? - Coldfusion 8 - это сервер приложений, просто к вашему сведению ....

SELECT  *
FROM    pro_Profile p 
        INNER JOIN pro_Email e ON p.profileID = e.profileID
        INNER JOIN mod_userStatus m ON p.profileID = m.profileID 
        <!--- Joins the pro staff profiles to the employment app ---> 
        INNER JOIN mod_employmentAppJobTitles a ON p.profileID = a.departmentID
         <!--- Join Job titles to the jobs ---> 
        INNER JOIN mod_employmentAppJobs b ON a.jobTitleID=b.jobTitleID
        <!--- Joining the table on where the profile equals everything else ---> 
        INNER JOIN mod_employmentAppProfile c ON c.eAppID = b.eAppID 
WHERE   b.emailSent = 'False'

Ответы [ 5 ]

2 голосов
/ 03 мая 2011

У вас есть несколько вариантов выбора.

1) Используйте временную таблицу и сначала выберите там данные, обновите mod_employmentAppJobs и выполните выбор из временной таблицы, чтобы получить ваши данные.

Итак, это будет выглядеть примерно так:

создать временную таблицу

CREATE TABLE #tmpTABLE 
(
  EmailAddress varchar(100),
  JobTitle varchar(50),
  JobTitleId bigint 
  ......
)

Вставить в нее

INSERT INTO #tmpTable
SELECT EmailAddress,JobTitle, ........
    FROM pro_Profile p 
    INNER JOIN pro_Email e 
    ON p.profileID = e.profileID
    INNER JOIN mod_userStatus m 
    ON p.profileID = m.profileID 
    <!--- Joins the pro staff profiles to the employment app ---> 
    INNER JOIN mod_employmentAppJobTitles a
    ON p.profileID = a.departmentID
    INNER JOIN mod_employmentAppJobs b
    <!--- Join Job titles to the jobs ---> 
    ON a.jobTitleID=b.jobTitleID
    <!--- Joining the table on where the profile equals everything else ---> 
    INNER JOIN mod_employmentAppProfile c
    ON c.eAppID = b.eAppID 
    WHERE b.emailSent = 'False'

Обновить исходную таблицу (я бырекомендовать индекс для jobTitleId во временной таблице для производительности, если применимо)

UPDATE mod_employmentAddJobs
    SET EmailSent="true"
    FROM mod_employmentAppJobs b
      INNER JOIN #tmpTable tmp
    ON b.jobTitleID=tmp.jobTitleID

Получить фактические данные обратно на уровень приложения

SELECT * FROM #tmpTable

Для лучшего вкуса, я рекомендую обсыпка с помощью BEGIN TRAN ... COMMIT ... ROLLBACK и BEGIN TRY..END TRY BEGIN CATCH ... END CATCH по вкусу и требованиям бизнеса.

Кроме того, это хороший способ броситьвременная таблица после того, как вы закончили с ней, даже если SQL-сервер не будет обижаться, если вы этого не сделаете.

2) Вы можете использовать предложение OUTPUT оператора обновления.

UPDATE mod_employmentAddJobs
    SET EmailSent="true"
    FROM pro_Profile p 
    INNER JOIN pro_Email e 
    ON p.profileID = e.profileID
    INNER JOIN mod_userStatus m 
    ON p.profileID = m.profileID 
    <!--- Joins the pro staff profiles to the employment app ---> 
    INNER JOIN mod_employmentAppJobTitles a
    ON p.profileID = a.departmentID
    INNER JOIN mod_employmentAppJobs b
    <!--- Join Job titles to the jobs ---> 
    ON a.jobTitleID=b.jobTitleID
    <!--- Joining the table on where the profile equals everything else ---> 
    INNER JOIN mod_employmentAppProfile c
    ON c.eAppID = b.eAppID 
    WHERE b.emailSent = 'False'

ВЫВОД вставлен. *

Это должно дать вам набор результатовобратно на уровень приложения

2 голосов
/ 03 мая 2011

Вы можете сохранить результат во временной таблице. Вы можете использовать данные во временной таблице и по-прежнему возвращать их в конце. Это много печатать, но довольно просто:

-- Select data into temporary table
declare @result table (jobTitleID int, ...)

INSERT  @result
        (jobTitleID, ...)
SELECT  jobTitleID
FROM    pro_Profile p 
...

-- Update unreadMail flag
update  mod_employmentAppJobs 
set     unreadMail = 'False'
where   jobTitleID in (select jobTitleId from @result)

-- Return result to application
select  jobTitleId, ...
from    @result
0 голосов
/ 03 мая 2011

Я просто прикрепил к концу, и это сработало:

    UPDATE mod_employmentAppJobs
    SET emailSent = 'True'
0 голосов
/ 03 мая 2011

Ну, это просто идея, а не лучшее решение.
Вы можете получить данные (для которых бит равен false) в DataReader, а затем выполнить бит установки команды в значение true для идентификаторов, содержащихся в наборе данных.
Набор данных возвращает необходимые данные ...

0 голосов
/ 03 мая 2011

Если вам нужно обновить и затем вернуть данные, то, вероятно, лучше всего использовать хранимую процедуру, где вы сначала запрашиваете данные, обновляете их, а затем возвращаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...