使用“if Exists”条件生成现有行的插入脚本

介绍

数据传输是应用程序编程中最常见的任务之一。如果您在应用程序编程并且支持生产环境,您将很容易理解发送插入脚本在生产中运行,无论是配置条目还是数据更正脚本。

如果您要将数据脚本发送到生产环境,则需要格外小心。即使一个不正确的数据值也会导致完全的混乱。而且,这就是为什么建立这些脚本需要时间。

本文将提供一个实用程序存储过程,以生成insert很多灵活性。您将能够生成脚本:

  1. 任何你想要的桌子上
  2. 根据条件
  3. 使用If Exists基于您提供的列的“ ”子句
  4. 包括或排除标识列
  5. 根据您的输入排除列

背景

像你一样,我也经历了这些痛苦。虽然有一些免费的选项可用,如SQL Server的“生成脚本”工具,以及一些在互联网上发表的文章/选项。但是,我需要一些工具/实用程序来获得更多的生成插入命令。基本上,我需要对现有的工具/实用程序进行以下补充:

  1. 我应该能够根据任何条件生成脚本,例如我们可以根据条件选择任意数量的行。
  2. 我应该能够用“ If Exists”子句生成脚本,因为我不确定数据是否已经存在于产品中。
  3. 我可能希望排除排除标识列值。
  4. 我可能想排除一些列(例如 - 系统列可能是默认的)

使用代码

注意:对于我们所有的例子,我们使用“Northwind”数据库。

若要使用存储过程(usp_CreateInserts)生成插入,请按照下列步骤操作:

  1. 从这篇文章下载附件。
  2. 打开SSMS并在数据库中运行usp_CreateInserts.SQL

从“ Orders”表生成所有插入的例子

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', @FromAndWhere = 'FROM Orders'

/* Query will give result in this format

IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE 1=1)
    BEGIN 
    INSERT INTO [Orders] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],[ShippedDate],_
                [ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],[ShipPostalCode],_
                [ShipCountry])VALUES(10248,'VINET',5,'Jul  4 1996 12:00:00:000AM',_
                'Aug  1 1996 12:00:00:000AM','Jul 16 1996 12:00:00:000AM',3,32.3800,_
                'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims',NULL,'51100','France') 
    END
IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE 1=1)
    BEGIN 
    INSERT INTO [Orders] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],[ShippedDate],_
                [ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],[ShipPostalCode],_
                [ShipCountry])VALUES(10249,'TOMSP',6,'Jul  5 1996 12:00:00:000AM',_
                'Aug 16 1996 12:00:00:000AM','Jul 10 1996 12:00:00:000AM',1,11.6100,_
                'Toms Spezialitäten','Luisenstr. 48','Münster',NULL,'44087','Germany') 
    END

    .
    .
    .

*/

Orders根据某些条件(“ Where子句”)从“ ”表生成所有插入的示例

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', _
@FromAndWhere = 'FROM Orders WHERE ShipCountry = ''Switzerland'''

/* Query will give result in this format

IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipCountry]='Germany')
    BEGIN 
    INSERT INTO [Orders] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],_
                [ShipPostalCode],[ShipCountry])VALUES(10249,'TOMSP',6,'Jul  5 1996 12:00:00:000AM',_
                'Aug 16 1996 12:00:00:000AM','Jul 10 1996 12:00:00:000AM',1,11.6100,_
                'Toms Spezialitäten','Luisenstr. 48','Münster',NULL,'44087','Germany') 
    END
IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipCountry]='France')
    BEGIN 
    INSERT INTO [Orders] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],_
                [ShipPostalCode],[ShipCountry])VALUES(10248,'VINET',5,'Jul  4 1996 12:00:00:000AM',_
                'Aug  1 1996 12:00:00:000AM','Jul 16 1996 12:00:00:000AM',3,32.3800,_
                'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims',NULL,'51100','France') 
    END

    .
    .
    .

*/

Orders基于某些条件(WhereClause)从“ ”表生成所有插入的例子,If Exists在多个列的基础上用“ ”从句生成:

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', _
@FromAndWhere = 'FROM Orders WHERE ShipCountry = ''Switzerland''', @CheckColList = 'ShipCountry,ShipVia'

/* Query will give result in this format

IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipVia]=2 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [Orders] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],_
                [ShipPostalCode],[ShipCountry])VALUES(10254,'CHOPS',5,'Jul 11 1996 12:00:00:000AM',_
                'Aug  8 1996 12:00:00:000AM','Jul 23 1996 12:00:00:000AM',2,22.9800,_
                'Chop-suey Chinese','Hauptstr. 31','Bern',NULL,'3012','Switzerland') 
    END
IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipVia]=3 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [Orders] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],_
                [ShipPostalCode],[ShipCountry])VALUES(10255,'RICSU',9,'Jul 12 1996 12:00:00:000AM',_
                'Aug  9 1996 12:00:00:000AM','Jul 15 1996 12:00:00:000AM',3,148.3300,_
                'Richter Supermarkt','Starenweg 5','Genève',NULL,'1204','Switzerland') 
    END

    .
    .
    .

*/

从“ Orders”表生成标识列生成所有插入的示例

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', _
     @FromAndWhere = 'FROM Orders WHERE ShipCountry = ''Switzerland''', _
     @CheckColList = 'ShipCountry,ShipVia',@OmitIdentity =1

/* Query will give result in this format

IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipVia]=2 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [Orders] ([CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],_
                [ShipRegion],[ShipPostalCode],[ShipCountry])VALUES('CHOPS',5,_
                'Jul 11 1996 12:00:00:000AM','Aug  8 1996 12:00:00:000AM',_
                'Jul 23 1996 12:00:00:000AM',2,22.9800,'Chop-suey Chinese','Hauptstr. 31',_
                'Bern',NULL,'3012','Switzerland') 
    END
IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipVia]=3 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [Orders] ([CustomerID],[EmployeeID],[OrderDate],[RequiredDate],[ShippedDate],_
                [ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],_
                [ShipPostalCode],[ShipCountry])VALUES('RICSU',9,'Jul 12 1996 12:00:00:000AM',_
                'Aug  9 1996 12:00:00:000AM','Jul 15 1996 12:00:00:000AM',3,148.3300,_
                'Richter Supermarkt','Starenweg 5','Genève',NULL,'1204','Switzerland') 
    END

    .
    .
    .

*/

从“ Orders”表生成顶部“n”插入的例子

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', _
@FromAndWhere = 'FROM Orders WHERE ShipCountry = ''Switzerland''', _
@CheckColList = 'ShipCountry,ShipVia',@Top = 10

从“ Orders”表生成所有插入的例子留下一些列。在这个例子中,我们排除了“ OrderId”和“ EmployeeID”列:

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', _
@FromAndWhere = 'FROM Orders WHERE ShipCountry = ''Switzerland''', _
@CheckColList = 'ShipCountry,ShipVia',@ExcludeColList = '''OrderID'',''CustomerID'''

/* Query will give result in this format

IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipVia]=2 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [Orders] ([EmployeeID],[OrderDate],[RequiredDate],[ShippedDate],_
                [ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],_
                [ShipPostalCode],[ShipCountry])VALUES(5,'Jul 11 1996 12:00:00:000AM',_
                'Aug  8 1996 12:00:00:000AM','Jul 23 1996 12:00:00:000AM',2,22.9800,_
                'Chop-suey Chinese','Hauptstr. 31','Bern',NULL,'3012','Switzerland') 
    END
IF NOT EXISTS(SELECT TOP 1 1 FROM Orders WHERE [ShipVia]=3 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [Orders] ([EmployeeID],[OrderDate],[RequiredDate],[ShippedDate],[ShipVia],_
                [Freight],[ShipName],[ShipAddress],[ShipCity],[ShipRegion],[ShipPostalCode],_
                [ShipCountry])VALUES(9,'Jul 12 1996 12:00:00:000AM','Aug  9 1996 12:00:00:000AM',_
                'Jul 15 1996 12:00:00:000AM',3,148.3300,'Richter Supermarkt','Starenweg 5',_
                'Genève',NULL,'1204','Switzerland') 
    END
    .
    .
    .

从“ Orders”表中生成所有具有所有者名称的插入对象的示例

EXEC [dbo].[usp_CreateInserts] @TableName = 'Orders', _
@FromAndWhere = 'FROM Orders WHERE ShipCountry = ''Switzerland''', _
@CheckColList = 'ShipCountry,ShipVia',@Owner = 'dbo'

/* Query will give result in this format

IF NOT EXISTS(SELECT TOP 1 1 FROM [dbo].[Orders] WHERE [ShipVia]=2 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [[dbo].[Orders]] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],_
                [ShipRegion],[ShipPostalCode],[ShipCountry])VALUES(10254,'CHOPS',5,_
                'Jul 11 1996 12:00:00:000AM','Aug  8 1996 12:00:00:000AM',_
                'Jul 23 1996 12:00:00:000AM',2,22.9800,'Chop-suey Chinese','Hauptstr. 31',_
                'Bern',NULL,'3012','Switzerland') 
    END
IF NOT EXISTS(SELECT TOP 1 1 FROM [dbo].[Orders] WHERE [ShipVia]=3 AND [ShipCountry]='Switzerland')
    BEGIN 
    INSERT INTO [[dbo].[Orders]] ([OrderID],[CustomerID],[EmployeeID],[OrderDate],[RequiredDate],_
                [ShippedDate],[ShipVia],[Freight],[ShipName],[ShipAddress],[ShipCity],_
                [ShipRegion],[ShipPostalCode],[ShipCountry])VALUES(10255,'RICSU',9,_
                'Jul 12 1996 12:00:00:000AM','Aug  9 1996 12:00:00:000AM',_
                'Jul 15 1996 12:00:00:000AM',3,148.3300,'Richter Supermarkt','Starenweg 5',_
                'Genève',NULL,'1204','Switzerland') 
    END
    .
    .
    .

*/

兴趣点

  • 如果“ @CheckColList”太长,就会失败,基本上变量不能处理大数据。我将尝试在未来的版本中解决此问题。
  • 此处鸣谢@Chetan Naithani@千讯工作室
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值