Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL保护,防止在执行两次时创建多行_Sql_Sql Server - Fatal编程技术网

SQL保护,防止在执行两次时创建多行

SQL保护,防止在执行两次时创建多行,sql,sql-server,Sql,Sql Server,我有一个基本的问题。请问,你能建议如何建立某种保护吗 正如你在下面看到的 如果执行两次,则必须防止创建两行。 它应防止创建重复项。这是我的家庭作业,我没有能力解决这个问题。我认为这不是一项艰巨的任务,但即使在谷歌上搜索,我也找不到解决方案 谢谢你的帮助和理解 这是一个代码 DECLARE @TEST BIT DECLARE @Environment VARCHAR(4) DECLARE @TargetDB VARCHAR(4) DECLARE @lMailboxID INT DECLARE @l

我有一个基本的问题。请问,你能建议如何建立某种保护吗

正如你在下面看到的

如果执行两次,则必须防止创建两行。 它应防止创建重复项。这是我的家庭作业,我没有能力解决这个问题。我认为这不是一项艰巨的任务,但即使在谷歌上搜索,我也找不到解决方案

谢谢你的帮助和理解

这是一个代码

DECLARE @TEST BIT
DECLARE @Environment VARCHAR(4)
DECLARE @TargetDB VARCHAR(4)
DECLARE @lMailboxID INT
DECLARE @lMailboxAddress VARCHAR(128)
DECLARE @lMailServer INT
DECLARE @lStorageFolder INT
DECLARE @lPollingTime INT
DECLARE @lActiveFlag INT
DECLARE @lCustomer VARCHAR(3)
DECLARE @lDomain VARCHAR(32)
DECLARE @lUsername VARCHAR(64)
DECLARE @lPassword VARCHAR(64)
DECLARE @lOperatingMode VARCHAR(15)
DECLARE @lARECode VARCHAR(4)
DECLARE @lOrgID VARCHAR(8)
DECLARE @lProcessFlag VARCHAR(1)
DECLARE @lSetReadFlag VARCHAR(1)
DECLARE @lSenderCheck INT
DECLARE @lDomainCheck VARCHAR(128)
DECLARE @lPDFCheck INT
DECLARE @lARECheck INT
DECLARE @lDocPriority INT
DECLARE @lOrgIDCheck INT
DECLARE @lSingleInvoice INT
DECLARE @lMailSourceFolder VARCHAR(32)
DECLARE @lMailMoveToFolder VARCHAR(32)
DECLARE @lFileExt VARCHAR(64)
DECLARE @lPrimaryDocType VARCHAR(6)
DECLARE @lSenderAddress VARCHAR(128)
DECLARE @lCockpitDocType VARCHAR(2)
DECLARE @lConfirmTemplate INT
DECLARE @lConfirmAddressCC VARCHAR(128)
DECLARE @lVerifRejectTemplate INT
DECLARE @lVerifRejectAddressCC VARCHAR(128)
DECLARE @lTechRejectTemplate INT
DECLARE @lTechRejectAddressCC VARCHAR(128)
DECLARE @lReducedValidation VARCHAR(1)
DECLARE @lLanguageForReply VARCHAR(2)
DECLARE @lRedirectNoReply VARCHAR(128)
DECLARE @lMailReplyTo VARCHAR(128)
DECLARE @lServiceName VARCHAR(100)
DECLARE @lAttachmentRule INT
DECLARE @DocRejectTemplate varchar(128)
DECLARE @DocRejectAddressCC varchar(128)
DEClARE @ConvertToPDFA bit
DECLARE @AdditionalCustomers varchar(128)
DECLARE @DeleteValidEmail int
DECLARE @DeleteInvalidEmail int 
DECLARE @MessageClass varchar(64)
DECLARE @VerifRescanTemplate varchar(128)
DECLARE @VerifRescanAddressCC VARCHAR(128)
DECLARE @RejectionLetterAddress VARCHAR(128)



DECLARE @RECORDCHANGES TABLE (Action VARCHAR(255), Change_what VARCHAR(255),             Change_to VARCHAR(255))

/********************************************************
*              STEP PREPARING VARIABLES                 *
*********************************************************/
SET @TargetDB = CASE @@SERVERNAME
    WHEN 'xyz/xyz'
        THEN 'DEV'
    WHEN 'xyz/xyz'
        THEN 'PROD'
    ELSE 'QA'
    END


IF @Environment <> @TargetDB
BEGIN
PRINT 'PATCH is not applying in right environment'


RETURN
END


/********************************************************
*              STEP CHECK                               *
*********************************************************/

 <<Here I want that code>>

/********************************************************
*              STEP  CHANGING                           *
*********************************************************/
BEGIN TRANSACTION


SELECT @lMailboxID = MailboxID
FROM BW_EC_MAILBOX
WHERE EmailAddress = @lMailboxAddress
AND SourceFolder = @lMailSourceFolder


IF @@ROWCOUNT = 0
BEGIN
INSERT INTO BW_EC_MAILBOX (ServerID, EmailAddress, DomainName, UserName, [Password])
VALUES (@lMailServer, @lMailboxAddress, @lDomain, @lUsername, @lPassword)


SET @lMailboxID = @@IDENTITY
END


UPDATE BW_EC_MAILBOX
SET ServerID = @lMailServer
    ,DomainName = @lDomain
    ,UserName = @lUsername
    ,[Password] = @lPassword
    ,SourceFolder = @lMailSourceFolder
    ,MoveToFolder = @lMailMoveToFolder
    ,ProcessFlag = @lProcessFlag
    ,SetReadFlag = @lSetReadFlag
    ,StorageFolder = @lStorageFolder
    ,OperatingMode = @lOperatingMode
    ,FileExt = @lFileExt
    ,PollingTime = @lPollingTime
    ,CheckMailboxAt = getdate()
    ,EnforceOrgIDCheck = @lOrgIDCheck
    ,EnforceARECheck = @lARECheck
    ,SingleInvoicePerEmail = @lSingleInvoice
    ,PrimaryDocType = @lPrimaryDocType
    ,DocPriority = @lDocPriority
    ,CockpitDocType = @lCockpitDocType
    ,Customer = @lCustomer
    ,ARECode = @lARECode
    ,OrgID = @lOrgID
    ,EnforceSenderCheck = @lSenderCheck
    ,EnforcePDFCheck = @lPDFCheck
    ,ConfirmTemplate = @lConfirmTemplate
    ,ConfirmAddressCC = @lConfirmAddressCC
    ,VerifRejectTemplate = @lVerifRejectTemplate
    ,VerifRejectAddressCC = @lVerifRejectAddressCC
    ,TechRejectTemplate = @lTechRejectTemplate
    ,TechRejectAddressCC = @lTechRejectAddressCC
    ,ReducedValidation = @lReducedValidation
    ,LanguageForReply = @lLanguageForReply
    ,RedirectNoReply = @lRedirectNoReply
    ,MailReplyTo = @lMailReplyTo
    ,ServiceName = @lServiceName
    ,AttachmentRule = @lAttachmentRule
    ,DomainCheck = @lDomainCheck
    ,ActiveFlag = @lActiveFlag
    ,DocRejectTemplate = @DocRejectTemplate
    ,DocRejectAddressCC = @DocRejectAddressCC
    ,ConvertToPDFA = @ConvertToPDFA
    ,AdditionalCustomers = @AdditionalCustomers
    ,DeleteValidEmail = @DeleteValidEmail
    ,DeleteInvalidEmail = @DeleteInvalidEmail
    ,MessageClass = @MessageClass
    ,VerifRescanTemplate = @VerifRescanTemplate
    ,VerifRescanAddressCC = @VerifRescanAddressCC
    ,RejectionLetterAddress = @RejectionLetterAddress
WHERE EmailAddress = @lMailboxAddress

SELECT *
FROM @RECORDCHANGES


/********************************************************
*              STEP COMMIT OR ROLLBACK                  *
*********************************************************/
IF @TEST = 1
BEGIN
ROLLBACK TRANSACTION


PRINT 'ROLLBACK'
END
ELSE
BEGIN
COMMIT TRANSACTION


PRINT 'COMMIT'
END

如果有人能帮助我,我将不胜感激。

为了防止重复插入,您可以尝试以下条款:

IF @@ROWCOUNT = 0
BEGIN
   IF NOT EXISTS (SELECT * FROM BW_EC_MAILBOX 
          WHERE ServerID = @lMailServer
            EmailAddress = @lMailboxAddress
            DomainName = @lDomain 
            UserName = @lUsername
            [Password] = @lPassword)
   BEGIN
       INSERT INTO BW_EC_MAILBOX (ServerID, EmailAddress, DomainName, UserName, [Password])
       VALUES (@lMailServer, @lMailboxAddress, @lDomain, @lUsername, @lPassword)
   END
SET @lMailboxID = @@IDENTITY

END

更新重复项没有任何意义,因此您只需要处理插入项。

您希望使用唯一的索引/约束。这是防止重复的正确方法,因为数据库将保证数据的完整性。特别是,同时进行的两次插入不能插入重复项

我不确定您希望复制什么,但类似于:

create unique index unq_bw_ec_mailbox_emailaddress on BW_EC_MAILBOX(EmailAddress);

这假定EmailAddress是唯一的。您可能还希望在索引中包含其他列,如服务器或用户名。

您可以为一列或一组列添加唯一约束,之后重复插入将失败。因为这是家庭作业,我对仅为您这样做感到不安,因此,请阅读有关使用IF EXISTS检查您要插入的数据是否已经存在的内容。谢谢大家。你能推荐一些关于SQL的源代码吗?我可能表达得不对。我只是想要一些保护,比如打印,如果你还没有准备好执行,你已经执行了。然后使用IF EXISTS而不是IF NOT EXISTS,并在内部开始执行已执行的简单打印。希望这有意义?非常感谢