【发布时间】:2018-10-08 11:34:23
【问题描述】:
我想知道检查记录是否存在然后运行更新语句或检查记录是否不存在然后运行插入语句的最佳方法是什么?我需要if not exists 的原因是因为我在表中插入了帐户信息。在我们必须更新的情况下,我只是在寻找唯一的 ID。在其他情况下,对于插入,我必须确保表中不存在 email 或 username。这是我的查询示例:
<cfset var isUser = structKeyExists(FORM, "frmSaveaccount_isuser") ? true : false>
<cfset var isStaff = structKeyExists(FORM, "frmSaveaccount_isstaff") ? true : false>
<cftransaction action="begin">
<cftry>
<cfquery name="saveAccount" datasource="#Application.dsn#">
DECLARE @AccountID UNIQUEIDENTIFIER = CASE WHEN LEN('#FORM.frm_accountid#') <> 0 THEN <cfqueryparam cfsqltype="cf_sql_idstamp" value="#trim(FORM.frm_accountid)#"> ELSE NEWID() END;
DECLARE @FirstName VARCHAR(50) = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="50" value="#trim(FORM.frm_firstname)#">;
DECLARE @LastName VARCHAR(50) = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="50" value="#trim(FORM.frm_lastname)#">;
DECLARE @Middle CHAR(1) = <cfqueryparam cfsqltype="cf_sql_char" maxlength="1" value="#FORM.frm_middle#" null="#!len(trim(FORM.frmSaveaccount_middle))#">;
DECLARE @Email VARCHAR(80) = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="80" value="#trim(FORM.frm_email)#">;
<cfif isUser>
DECLARE @IsUser BIT = <cfqueryparam cfsqltype="cf_sql_bit" maxlength="1" value="#trim(structKeyExists(FORM, 'frm_isuser')? 1:0)#">;
DECLARE @ActiveUser BIT = <cfqueryparam cfsqltype="cf_sql_bit" maxlength="1" value="#trim(structKeyExists(FORM, 'frm_activeuser')? 1:0)#">;
DECLARE @SystemAdmin BIT = <cfqueryparam cfsqltype="cf_sql_bit" maxlength="1" value="#trim(structKeyExists(FORM, 'frm_systemadmin')? 1:0)#">;
DECLARE @UserName VARCHAR(50) = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="50" value="#trim(FORM.frm_username)#">;
</cfif>
<cfif isStaff>
DECLARE @IsStaff BIT = <cfqueryparam cfsqltype="cf_sql_bit" maxlength="1" value="#trim(structKeyExists(FORM, 'frm_isstaff')? 1:0)#">;
DECLARE @ActiveStaff BIT = <cfqueryparam cfsqltype="cf_sql_bit" maxlength="1" value="#trim(structKeyExists(FORM, 'frm_activestaff')? 1:0)#">;
DECLARE @Position VARCHAR(10) = <cfqueryparam cfsqltype="cf_sql_varchar" maxlength="10" value="#trim(FORM.frm_positioncode)#" null="#!len(trim(FORM.frm_positioncode))#">;
</cfif>
DECLARE @ActionDate DATETIME = CURRENT_TIMESTAMP;
DECLARE @ActionID UNIQUEIDENTIFIER = <cfqueryparam cfsqltype="cf_sql_idstamp" value="#AccountID#">;
BEGIN TRAN
IF EXISTS (SELECT AccountID FROM Accounts WITH (updlock,serializable) WHERE AccountID = @AccountID)
BEGIN
UPDATE Accounts
SET
FirstName = @FirstName,
LastName = @LastName,
Middle = @Middle,
Email = @Email,
<cfif isUser>
IsUser = @IsUser,
ActiveUser = @ActiveUser,
SystemAdmin = @SystemAdmin,
UserName = @UserName,
</cfif>
<cfif isStaff>
IsStaff = @IsStaff,
ActiveStaff = @ActiveStaff,
Position = @Position,
</cfif>
ActionDate = @ActionDate,
ActionID = @ActionID
WHERE AccountID = @AccountID
SELECT @AccountID AS RecID
END
ELSE
BEGIN
IF NOT EXISTS(SELECT 1 FROM Accounts WHERE Email = @Email <cfif isUser> OR UserName = @UserName</cfif>)
INSERT INTO Accounts (
AccountID,FirstName,LastName,Middle,Email,
<cfif isUser>
IsUser,ActiveUser,SystemAdmin,UserName,
</cfif>
<cfif isStaff>
IsStaff,ActiveStaff,Position,
</cfif>
ActionDate,ActionID
) VALUES (
@AccountID,@FirstName,@LastName,@Middle,@Email,
<cfif isUser>
@IsUser,@ActiveUser,@SystemAdmin,@UserName,
</cfif>
<cfif isStaff>
@IsStaff,@ActiveStaff,@Position,
</cfif>
@ActionDate,@ActionID
)
SELECT @AccountID AS RecID
END
COMMIT TRAN
</cfquery>
<cfcatch type="any">
<cftransaction action="rollback" />
<cfset var fnResults.status = "400">
<cfset var fnResults.message = "Error! Please contact your administrator.">
</cfcatch>
</cftry>
</cftransaction>
我想知道这是否是更好的方法,然后拆分为两个单独的查询插入/更新?还有没有更好的方法来检查记录是否存在?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: sql sql-server sql-server-2008 coldfusion exists