[英]SQL Server 2008: Select then update statement
我正在为我的应用程序的一个模块跨 6 个表进行 INNER JOIN,基本上它需要 prostaff 获取他们的名字和 email,并将其与求职者列表进行比较。
在 mod_employmentAppJobs 上,我需要为选择的每一行设置一列为真。 基本上,这会设置一个标志,告诉 sql 不要 select 该列,因为我们已经向该用户发送了 email。 这是一个位领域。
如何在 SQL 语句中将 emailSent 字段设置为 true? -- 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'
您可以将结果存储在临时表中。 您可以使用临时表中的数据,最后仍然返回。 打字很多,但非常简单:
-- 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
你有几个选择。
1)首先使用临时表和 select 数据,更新 mod_employmentAppJobs,然后从临时表中执行 select 以检索您的数据。
所以,它看起来像这样。
创建临时表
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'
OUTPUT 已插入。*
这应该让你的结果集回到你的应用层
如果您需要更新然后返回数据,那么最好的方法可能是使用存储过程,您首先查询数据,更新它然后返回它。
嗯,这只是一个想法,不是最好的解决方案。
您可以在 DataReader 中获取数据(该位为假),然后对 Dataset 中包含的 id 执行命令设置位为真。
数据集返回您需要的数据...
我只是在最后加上了一个,它起作用了:
UPDATE mod_employmentAppJobs
SET emailSent = 'True'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.