之前,在Codeproject發(fā)表過一篇關(guān)于用現(xiàn)有表中數(shù)據(jù)創(chuàng)建Insert的Sql語句的存儲(chǔ)過程,今天將其搬到這里來,注意本存儲(chǔ)過程僅適用于SQL SERVER。 介紹一些時(shí)候,你想導(dǎo)出一些現(xiàn)有表中記錄的Sql腳本以便你可以插入這些數(shù)據(jù)到另一個(gè)數(shù)據(jù)庫的相似表中。有很多方式可以做到,現(xiàn)在,我將跟大家分享一個(gè)存儲(chǔ)過程來一起實(shí)現(xiàn)它。希望對(duì)各位有所幫助。 代碼首先,請(qǐng)?jiān)谀愕腟QL Server數(shù)據(jù)庫中創(chuàng)建如下名為[dbo].[sp_CreateInsertScript]存儲(chǔ)過程,其內(nèi)容如下: --============================================= -- 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
示例下來,我舉一個(gè)例子幫大家理解如何使用它,假設(shè)在你的數(shù)據(jù)庫中有個(gè)表Country(國家),你想得到這個(gè)表中一些數(shù)據(jù)記錄的用于插入的SQL語句,記錄篩選條件是列 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] 下來,通過調(diào)用你創(chuàng)建的存儲(chǔ)過程,用如下語句執(zhí)行以便產(chǎn)生你想要的SQL的插入(INSERT)語句。調(diào)用執(zhí)行腳本如下: exec sp_CreateInsertScript '[dbo].[Country]','[continent_name]=''North America''' 執(zhí)行之后,你會(huì)得到你想要結(jié)果,下圖為我電腦的截圖。 現(xiàn)在,你就可以拷貝這些結(jié)果或者通過右鍵菜單的選項(xiàng)保持輸出結(jié)果為一個(gè)查詢或者文本文件,以便你下來使用。Thanks! |
|