创建一个SQL脚本,在表中插入多个项目,但首先检查每个项目是否存在

创建一个SQL脚本,在表中插入多个项目,但首先检查每个项目是否存在,sql,sql-server,ssms,Sql,Sql Server,Ssms,在SQL Server Management Studio中,我开始生成脚本并创建一个插入脚本,如下所示: SET IDENTITY_INSERT [dbo].[Product] ON GO INSERT [dbo].[Product] ([Id], [Name]) VALUES (1, N'Product 1') GO INSERT [dbo].[Product] ([Id], [Name]) VALUES (2, N'Product 2') GO INSERT [dbo].[Product

在SQL Server Management Studio中,我开始生成脚本并创建一个插入脚本,如下所示:

SET IDENTITY_INSERT [dbo].[Product] ON 
GO
INSERT [dbo].[Product] ([Id], [Name]) VALUES (1, N'Product 1')
GO
INSERT [dbo].[Product] ([Id], [Name]) VALUES (2, N'Product 2')
GO
INSERT [dbo].[Product] ([Id], [Name]) VALUES (3, N'Product 3')
GO
SET IDENTITY_INSERT [dbo].[Product] OFF
GO
假设我有多个客户端数据库,我希望能够在所有这些数据库上安全地运行此脚本,无论这些产品是否已经存在。我真的必须用if来包装每一个插入行吗?还是有更好的方法


最终的计划是将其用作SQL SERVER数据库项目中包含系统设置等项的表的部署后脚本。

为什么不一步完成所有插入操作

SET IDENTITY_INSERT [dbo].[Product] ON 
GO
INSERT [dbo].[Product] ([Id], [Name]) 
select id,name from products t where not exists(select 1 from products t2 where t2.id=t1.id and t2.name=t1.name
GO
SET IDENTITY_INSERT [dbo].[Product] OFF
INSERT [dbo].[Product] ([Id], [Name])
    SELECT id, name
    FROM (VALUES (1, N'Product 1'),
                 (2, N'Product 2')
                 (3, N'Product 3')
         ) v(Id, Name)
    WHERE NOT EXISTS (SELECT 1 FROM Product P2 WHERE p2.id = v.id);

为什么不一步完成所有插入

INSERT [dbo].[Product] ([Id], [Name])
    SELECT id, name
    FROM (VALUES (1, N'Product 1'),
                 (2, N'Product 2')
                 (3, N'Product 3')
         ) v(Id, Name)
    WHERE NOT EXISTS (SELECT 1 FROM Product P2 WHERE p2.id = v.id);

我最近遵循的模式可能也适合您的情况:

SELECT name
INTO #My_Table
FROM dbo.My_Table
WHERE 1=0

INSERT INTO #My_Table
VALUES
    ('One'),
    ('Two')
    ... etc.

INSERT INTO dbo.My_Table (id, name)
SELECT id, name
FROM #My_Table
WHERE name NOT IN (SELECT name FROM My_Table)

DROP TABLE #My_Table
这假设
id
只是一个
IDENTITY
列,
name
是带有
UNIQUE
约束的真实标识符。如果您的结构不同,那么您可以相应地进行调整

如果行的唯一性由多个列确定,则可以使用另一种方法检查是否存在(
LEFT-OUTER-JOIN
并检查
NULL
或子查询等)


我发现这使我能够以方便、易读的格式保存表中的所有数据,并且易于在
值中维护,这是我最近遵循的模式,可能也适合您的情况:

SELECT name
INTO #My_Table
FROM dbo.My_Table
WHERE 1=0

INSERT INTO #My_Table
VALUES
    ('One'),
    ('Two')
    ... etc.

INSERT INTO dbo.My_Table (id, name)
SELECT id, name
FROM #My_Table
WHERE name NOT IN (SELECT name FROM My_Table)

DROP TABLE #My_Table
这假设
id
只是一个
IDENTITY
列,
name
是带有
UNIQUE
约束的真实标识符。如果您的结构不同,那么您可以相应地进行调整

如果行的唯一性由多个列确定,则可以使用另一种方法检查是否存在(
LEFT-OUTER-JOIN
并检查
NULL
或子查询等)

我发现这使我能够以方便、易读的格式保存表中的所有数据,并且易于在
值中维护