在 SQL 服务器中使用用户定义的 table 类型插入数据时如何避免重复记录

How to avoid duplicate record while inserting data using user defined table type in SQL Server

我正在尝试使用我的 .net 应用程序将整个模型插入数据库。我正在使用用户定义的 table 类型。

这是我的程序和用户自定义的table;我正在使用 SQL Server 2012。

CREATE TYPE [dbo].[TmpAccessRequest] AS TABLE
(
    [RequestId] [int] NULL,
    [RequesterID] [int] NULL,
    [RequestType] [int] NULL,
    [NextApprover] [int] NULL,
    [RequestStatus] [varchar](100) NULL,
    [Delegation] [int] NULL,
    [CreatedOn] [date] NULL,
    [CreatedBy] [varchar](100) NULL,
    [Description] [varchar](max) NULL,
    [IsSepecialRequest] [bit] NULL,
    [DelegationDetailID] [int] NULL,
    [IsActive] [bit] NULL,
    [IsDeleted] [bit] NULL,
    [ModifiedOn] [date] NULL
)
GO

CREATE PROCEDURE [dbo].[proc_SaveAccessRequest] 
   (@TmpAR TmpAccessRequest READONLY,
    @IsUAMSRequest BIT,
    @RequestID INT OUTPUT) 
AS  
BEGIN
    INSERT INTO tblRequests (RequesterID, RequestType, NextApprover, RequestStatus,
                             Delegation, CreatedOn, CreatedBy, Description,
                             IsSepecialRequest, DelegationDetailID, IsActive, IsDeleted, ModifiedOn)
        SELECT
            RequesterID, RequestType, NextApprover, RequestStatus,
            Delegation, CreatedOn, CreatedBy, Description,
            IsSepecialRequest, DelegationDetailID, IsActive, IsDeleted, ModifiedOn
        FROM
            @TmpAR  

    SET @RequestID = SCOPE_IDENTITY()

    --SET @RequestID=IDENT_CURRENT('tblRequests') 
    SELECT @RequestID
END

我想检查是否不应同时插入重复数据。那么如何使用用户定义的 table 类型来做到这一点?

请找出对您的脚本所做的更改以避免插入重复记录。所以我认为两列数据应该是唯一的,以避免用户理解目的的重复

 CREATE PROCEDURE [dbo].[proc_SaveAccessRequest] 
(
  @TmpAR TmpAccessRequest READONLY,
  @IsUAMSRequest bit,
  @RequestID int OUTPUT
) 
AS  
BEGIN

     Insert into tblRequests
    (
       RequesterID
      ,RequestType
      ,NextApprover
      ,RequestStatus
      ,Delegation
      ,CreatedOn
      ,CreatedBy
      ,[Description]
      ,IsSepecialRequest
      ,DelegationDetailID
      ,IsActive
      ,IsDeleted
      ,ModifiedOn
    )
    SELECT
       RequesterID
      ,RequestType
      ,NextApprover
      ,RequestStatus
      ,Delegation
      ,CreatedOn
      ,CreatedBy
      ,Description
      ,IsSepecialRequest
      ,DelegationDetailID
      ,IsActive
      ,IsDeleted
      ,ModifiedOn
     FROM @TmpAR  
     WHERE NOT EXISTS ( SELECT 1 
                        FROM tblRequests i
                        INNER JOIN @TmpAR o  
                            ON i.RequesterID = o.RequesterID
                         AND i.RequestType = o.RequestType 
                         AND i.NextApprover = o.NextApprover)

     SELECT @RequestID = SCOPE_IDENTITY()

     SELECT @RequestID
END