(Sqlserver)用现有表中的数据创建Sql的Insert插入语句

database

之前,在Codeproject发表过一篇关于用现有表中数据创建Insert的Sql语句的存储过程,今天将其搬到这里来,注意本存储过程仅适用于SQL SERVER。

介绍

一些时候,你想导出一些现有表中记录的Sql脚本以便你可以插入这些数据到另一个数据库的相似表中。有很多方式可以做到,现在,我将跟大家分享一个存储过程来一起实现它。希望对各位有所帮助。

代码

首先,请在你的SQL Server数据库中创建如下名为[dbo].[sp_CreateInsertScript]存储过程

[dbo].[sp_CreateInsertScript] content:

--=============================================

-- 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

-- =============================================

CREATEPROC[dbo].[sp_CreateInsertScript] (

@tablenameNVARCHAR(256) -- table name

,@conNVARCHAR(400) -- condition to filter data

,@ignoreIdentityColbit=0--indicate if ignore columne with identity

,@isDebugbit=0--indicate if this is used to debug. when 1,output the internal sql string

)

AS

BEGIN

SET NOCOUNT ON

DECLARE@sqlstrNVARCHAR(MAX);

DECLARE@valueStr1NVARCHAR(MAX);

DECLARE@colsStrNVARCHAR(MAX);

SELECT@sqlstr="SELECT ""INSERT "+@tablename;

SELECT@valueStr1="";

SELECT@colsStr="(";

SELECT@valueStr1="VALUES (""+";

IFRTRIM(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 =104THEN"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"""

ENDAS 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") =0OR@ignoreIdentityCol=0)

) AS t

ORDERBY 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的记录。表的创建脚本如下:

CREATETABLE[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!

以上是 (Sqlserver)用现有表中的数据创建Sql的Insert插入语句 的全部内容, 来源链接: utcz.com/z/531287.html

回到顶部