Sql server中用现有表中的数据创建Sql的Insert插入语句
之前,在Codeproject发表过一篇关于用现有表中数据创建Insert的Sql语句的存储过程,今天将其搬到这里来,注意本存储过程仅适用于SQL SERVER。
介绍
一些时候,你想导出一些现有表中记录的Sql脚本以便你可以插入这些数据到另一个数据库的相似表中。有很多方式可以做到,现在,我将跟大家分享一个存储过程来一起实现它。希望对各位有所帮助。
代码
首先,请在你的SQL Server数据库中创建如下名为[dbo].[sp_CreateInsertScript]存储过程,其内容如下:
--=============================================
-- Author: Mark Kang
-- Company: www.ginkia.com
-- Create date: 2016-03-06
-- Description: Generat the insert sql script according to the data in the specified table.
-- It does not support the columns with timestamp,text,image.
-- Demo : exec sp_CreateInsertScript '[dbo].[Country]','[continent_name]=''North America'''
-- Change History:
-- 1.2016-03-06 Created and published
-- 2.2016-03-08 Based on Mike's suggestions, I optimized the codes
-- 3.2019-03-09 1)Add code lines to avoid error when @con is empty string
-- 2)Based on Lukas Macedo's suggetstions, add surrounding brackets for column name
-- 3)Simplify WHEN...CASE
-- =============================================
CREATE PROC [dbo].[sp_CreateInsertScript] (
@tablename NVARCHAR(256) -- table name
,@con NVARCHAR(400) -- condition to filter data
,@ignoreIdentityCol bit=0 --indicate if ignore columne with identity
,@isDebug bit=0 --indicate if this is used to debug. when 1,output the internal sql string
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @sqlstr NVARCHAR(MAX);
DECLARE @valueStr1 NVARCHAR(MAX);
DECLARE @colsStr NVARCHAR(MAX);
SELECT @sqlstr='SELECT ''INSERT '+@tablename;
SELECT @valueStr1='';
SELECT @colsStr='(';
SELECT @valueStr1='VALUES (''+'; IF RTRIM(LTRIM(@con))=''
SET @con='1=1'; SELECT @valueStr1=@valueStr1+col+'+'',''+'
,@colsStr=@colsStr+'['+name +'],'
FROM (
SELECT
CASE
/* xtype=173 'binary'
xtype=165 'varbinary'*/
WHEN sc.xtype in (173,165) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR('+CONVERT(NVARCHAR(4),sc.[length]*2+2)+'),['+sc.name +'])'+' END'
/*xtype=104 'bit'*/
WHEN sc.xtype =104 THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR(1),['+sc.name +'])'+' END'
/*xtype=61 'datetime'
xtype=58 'smalldatetime'*/
WHEN sc.xtype in(58,61) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'''N''''''+'+'CONVERT(NVARCHAR(23),'+sc.name +',121)'+ '+'''''''''+' END'
/*xtype=175 'char'
xtype=36 'uniqueidentifier'
xtype=167 'varchar'
xtype=231 'nvarchar'
xtype=239 'nchar'*/
WHEN sc.xtype in (36,175,167,231,239) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'''N''''''+'+'REPLACE(['+sc.name+'],'''''''','''''''''''')' + '+'''''''''+' END'
/*xtype=106 'decimal'
xtype=108 'numeric'*/
WHEN sc.xtype in(106,108) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR('+CONVERT(NVARCHAR(4),sc.xprec+2)+'),['+sc.name +'])'+' END'
/*xtype=59 'real'
xtype=62 'float'*/
WHEN sc.xtype in (59,62) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR(23),'+sc.name +',2)'+' END'
/*xtype=48 'tinyint'
xtype=52 'smallint'
xtype=56 'int'
xtype=127 'bigint'
xtype=122 'smallmoney'
xtype=60 'money'*/
WHEN sc.xtype in (48,52,56,127,122,60) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR(23),['+sc.name +'])'+' END'
ELSE '''NULL'''
END AS col
,sc.colid
,sc.name
FROM syscolumns AS sc
WHERE sc.id = object_id(@tablename)
AND sc.xtype <>189 --xtype=189 'timestamp'
AND sc.xtype <>34 --xtype=34 'image'
AND sc.xtype <>35 --xtype= 35 'text'
AND (columnproperty(sc.id, sc.name, 'IsIdentity') = 0 OR @ignoreIdentityCol=0)
) AS t
ORDER BY colid; SET @colsStr=left(@colsStr,len(@colsStr)-1)+') ';
SET @valueStr1=left(@valueStr1,len(@valueStr1)-3)+')'''; SELECT @sqlstr=@sqlstr+@colsStr+@valueStr1+' AS sql FROM '+@tablename + ' WHERE 1=1 AND ' + isnull(@con,'1=1'); IF @isDebug=1
BEGIN
PRINT '1.columns string: '+ @colsStr;
PRINT '2.values string: '+ @valueStr1
PRINT '3.'+@sqlstr;
END EXEC( @sqlstr);
SET NOCOUNT OFF
END
GO
示例
下来,我举一个例子帮大家理解如何使用它,假设在你的数据库中有个表Country(国家),你想得到这个表中一些数据记录的用于插入的SQL语句,记录筛选条件是列continent_name(洲名)的值为North America的记录。表的创建脚本如下:
CREATE TABLE [dbo].[Country](
[geoname_id] [varchar](50) NULL,
[locale_code] [varchar](50) NULL,
[continent_code] [varchar](50) NULL,
[continent_name] [varchar](50) NULL,
[country_iso_code] [varchar](50) NULL,
[country_name] [varchar](50) NULL
) ON [PRIMARY]
下来,通过调用你创建的存储过程,用如下语句执行以便产生你想要的SQL的插入(INSERT)语句。调用执行脚本如下:
exec sp_CreateInsertScript '[dbo].[Country]','[continent_name]=''North America'''
执行之后,你会得到你想要结果,下图为我电脑的截图。
现在,你就可以拷贝这些结果或者通过右键菜单的选项保持输出结果为一个查询或者文本文件,以便你下来使用。Thanks!
Sql server中用现有表中的数据创建Sql的Insert插入语句的更多相关文章
- Sql Server远程查询db 表中的数据,以本地
step 1: sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queri ...
- 【MYSQL 清空所有的的表中的数据的SQL的生成】
MYSQL 清空所有的的表中的数据的SQL的生成 select Concat('TRUNCATE TABLE ', TABLE_NAME, ';') from INFORMATION_SCHEMA.T ...
- SQL Server批量向表中插入多行数据语句
因自己学习测试需要,需要两个有大量不重复行的表,表中行数越多越好.手动编写SQL语句,通过循环,批量向表中插入数据,考虑到避免一致问题,设置奇偶行不同.个人水平有限,如有错误,还望指正. 语句如下: ...
- SQL Server 向堆表中插入数据的过程
堆表中 IAM 记录着的数据页,表的各个数据页之间没有联系.也就是说一个页面它不会知道自己的前一页是谁,也不知道自己的后一页是谁. 插入数据时先找到IAM页,再由pfs(page free spac ...
- SQL SERVER数据库的表中修改字段的数据类型后,不能保存
在数据库里面建了一个表,可是由于对SQL SERVER的建表功能不熟悉,不知道把主键设成什么是好,就先设置了个TEXT类型,可是后来朋友们告诉我说,TEXT类型容易让数据文件变得很大,还 是改成一 ...
- 如何将sqlserver表中的数据导出sql语句或生成insert into语句 [转]
输入表名,生成插入语句 drop proc proc_insert //如果存在就删除 go create proc proc_insert (@tablename varchar(256)) as ...
- SQL SERVER数据库的表中修改字段属性被阻止“Prevent saving changes that require table re-creation”
1.启动SQL SERVER,选择工具—>选项,去掉“ 阻止保存要求重新创建表的更改”前面的勾. 2.选择设计器 3.去掉“阻止保存要求重新创建表的更改”前面的对号,点击OK. 重新启动SQL ...
- SQL SERVER将指定表中的指定字段按照(,)逗号分隔
不开心呀,早知道不跳了,一跳跳坑里来了. 使用方式: DECLARE @ConsigneeAddressId INT; SET @ConsigneeAddressId = 1; SELECT * F ...
- 查询和删除数据表中反复数据的sql
1.查询表中反复数据. select * from people where peopleId in (select peopleId from people group by ...
随机推荐
- (三)快速添加touch事件
EasyTouch提供了类似UGUI的可视化点击事件,如button类似,此功能可以快速实现三维物体的旋转缩放.在场景中新建cube然后添加组件,输入quick会出现一下一个选项: quick dra ...
- vue 父子组件通信详解
这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...
- Go-back-N Implementation of reliable data transport (RDT)
[Author] @ Yubao Liu Tables 1.Overview 2.Design explanation 2.1Implemented Routines 2.2Called Routin ...
- web.xml 配置文件 超详细说明!!!
一.web.xml是什么? 首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的. web.xml文件是用来配置:欢迎页.serv ...
- 通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
- CentOS 8 发布了
CentOS 8 的发现注记是: https://wiki.centos.org/Manuals/ReleaseNotes/CentOS8.1905 CentOS 在 2019 年 9 月 25 日 ...
- Spring Boot2 系列教程(二十一)整合 MyBatis
前面两篇文章和读者聊了 Spring Boot 中最简单的数据持久化方案 JdbcTemplate,JdbcTemplate 虽然简单,但是用的并不多,因为它没有 MyBatis 方便,在 Sprin ...
- 『题解』洛谷P1063 能量项链
原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...
- Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
简介 经过一段时间的准备,完善的差不多了,继续分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 参考代码 platfo ...
- django 之创建自己的模板(使用案例)
Django 创建自己的模板篇(实例) 此处需要创建模板,主要是对自己的模板进行扩展: 一般是扩展模板的tag和filter两个功能.可以用来创建你自己的tag和filter功能库. 创建模板库 分为 ...