创建一个SQL脚本,在表中插入多个项目,但首先检查每个项目是否存在
在SQL Server Management Studio中,我开始生成脚本并创建一个插入脚本,如下所示:创建一个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
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
或子查询等)
我发现这使我能够以方便、易读的格式保存表中的所有数据,并且易于在值中维护