大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说(Sql server)用现有表中的数据创建Sql的Insert插入语句[通俗易懂],希望您对编程的造诣更进一步.
之前,在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 -- ============================================= 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
代码100分
示例
下来,我举一个例子帮大家理解如何使用它,假设在你的数据库中有个表Country(国家),你想得到这个表中一些数据记录的用于插入的SQL语句,记录筛选条件是列continent_name(洲名)的值为
North America的记录。表的创建脚本如下:
代码100分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!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/11059.html