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 ...
随机推荐
- 怎么在.NetCore3.0 中使用Log4net 写日志 及读取配置文件的信息
1:安装Log4Net的 NuGet 包: 我们通常之需要安装这一个包即可,其他的主包会自动被添加进来: insatll-package Microsoft.Extensions.Logging.L ...
- Java基础(二十三)集合(6)Map集合
Map接口作为Java集合框架中的第二类接口,其子接口为SortedMap接口,SortedMap接口的子接口为NavigableMap接口. 实现了Map接口具体类有:HashMap(子类Linke ...
- Modbus协议笔记
读线圈:就是说读开关量输出的状态,看看开关量输出的到底是开着的还是关着的,这样说有点不专业,但是好明白.比如要在上位机显示开关量输出的当状态,就得用这个功能码. 写线圈:就是说读开关量输入的状态,开关 ...
- LFU的基本原理与实现
前言:之前有写过一篇关于LRU的文章链接https://www.cnblogs.com/wyq178/p/9976815.html LRU全称:Least Recently Used:最近最少使用策 ...
- Linux 编译与交叉编译
在Linux环境中,所处平台不同,执行文件也就不同,同一执行文件不能在不同平台下使用 如在Ubnutu下 是用gcc编译一个.c文件 gcc main.c -o main.out -o 可以指定输出文 ...
- 一文搭建自己博客/文档系统:搭建,自动编译和部署,域名,HTTPS,备案等
本文纯原创,搭建后的博客/文档网站可以参考: Java 全栈知识体系.如需转载请说明原处. 第一部分 - 博客/文档系统的搭建 搭建博客有很多选择,平台性的比如: 知名的CSDN, 博客园, 知乎,简 ...
- MIT线性代数:21.特征值和特征向量
- js中几种继承实现
继承实现的几种方式 1.借助call实现继承 function p1() { this.name = 'p1' this.say = function () { console.log(this.na ...
- 爬虫之selenium爬取京东商品信息
import json import time from selenium import webdriver """ 发送请求 1.1生成driver对象 2.1窗口最大 ...
- wordpress插件:multiple post thumbnails(可为文章添加多个特色图片)
我们经常会给wordpress的文章加上特色图片来实现日志缩略图的需求,但是很多时候一张图片并不能够完美而又全面的表达我们wordpress文章的内容,这时候您可能就会需要这样一个能让wordpres ...