0

我正在尝试在一个表(比如 MyTable)中插入多条记录(~250),并且仅当它不存在时才想插入一个新行。

我正在使用 SQL Server 2008 R2 并从其他线程(如SQL 条件插入如果行不存在)获得帮助。

虽然我可以通过以下剥离脚本来实现这一点,但我想知道是否有更好(短)的方法来做到这一点,因为我必须对插入的每一行重复此检查。由于我们只需要在 DB 部署期间执行一次此脚本,因此我不太担心性能。

INSERT INTO MyTable([Description], [CreatedDate], [CreatedBy], [ModifiedDate], [ModifiedBy], [IsActive], [IsDeleted]) 

SELECT N'ababab', GETDATE(), 1, NULL, NULL, 1, 0
WHERE NOT EXISTS(SELECT * FROM MyTable WITH (ROWLOCK, HOLDLOCK, UPDLOCK)
   WHERE
      ([InstanceId] IS NULL OR  [InstanceId] = 1)
      AND [ChannelPartnerId] IS NULL
      AND [CreatedBy] = 1) 
UNION ALL

SELECT N'xyz', 1, GETDATE(), 1, NULL, NULL, 1, 0 
WHERE NOT EXISTS(SELECT * FROM [dbo].[TemplateQualifierCategoryMyTest] WITH (ROWLOCK, HOLDLOCK, UPDLOCK)
   WHERE
      ([InstanceId] IS NULL OR  [InstanceId] = 1)
      AND [ChannelPartnerId] IS NULL
      AND [CreatedBy] = 1)

-- More SELECT statements goes here
4

1 回答 1

0

您可以使用您的描述创建一个临时表,然后使用选择将它们全部插入 MyTable 中,该选择将检查临时表中尚未出现在您的目标中的行,(此技巧由 LEFT OUTER JOIN 结合实现WHERE-Clause 中 MyTable.Description 部分的 IS NULL):

DECLARE @Descriptions TABLE ([Description] VARCHAR(200) NOT NULL )

INSERT INTO @Descriptions ( Description )VALUES  ( 'ababab' )
INSERT INTO @Descriptions ( Description )VALUES  ( 'xyz' )

INSERT INTO dbo.MyTable
        ( Description ,
          CreatedDate ,
          CreatedBy ,
          ModifiedDate ,
          ModifiedBy ,
          IsActive ,
          IsDeleted
        )

SELECT d.Description, GETDATE(), 1, NULL, NULL, 1, 0
FROM @Descriptions d
LEFT OUTER JOIN dbo.MyTable mt ON d.Description = mt.Description
WHERE mt.Description IS NULL
于 2013-03-22T09:25:47.167 回答