经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
(Sql server)用现有表中的数据创建Sql的Insert插入语句
来源:cnblogs  作者:markkang  时间:2019/11/11 8:46:33  对本文有异议

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

介绍

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

代码

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

  1. [dbo].[sp_CreateInsertScript] content:
  2. --=============================================
  3. -- Author: Mark Kang
  4. -- Company: www.ginkia.com
  5. -- Create date: 2016-03-06
  6. -- Description: Generat the insert sql script according to the data in the specified table.
  7. -- It does not support the columns with timestamp,text,image.
  8. -- Demo : exec sp_CreateInsertScript '[dbo].[Country]','[continent_name]=''North America'''
  9. -- Change History:
  10. -- 1.2016-03-06 Created and published
  11. -- 2.2016-03-08 Based on Mike's suggestions, I optimized the codes
  12. -- 3.2019-03-09 1)Add code lines to avoid error when @con is empty string
  13. -- 2)Based on Lukas Macedo's suggetstions, add surrounding brackets for column name
  14. -- 3)Simplify WHEN...CASE
  15. -- =============================================
  16. CREATE PROC [dbo].[sp_CreateInsertScript] (
  17. @tablename NVARCHAR(256) -- table name
  18. ,@con NVARCHAR(400) -- condition to filter data
  19. ,@ignoreIdentityCol bit=0 --indicate if ignore columne with identity
  20. ,@isDebug bit=0 --indicate if this is used to debug. when 1,output the internal sql string
  21. )
  22. AS
  23. BEGIN
  24. SET NOCOUNT ON
  25. DECLARE @sqlstr NVARCHAR(MAX);
  26. DECLARE @valueStr1 NVARCHAR(MAX);
  27. DECLARE @colsStr NVARCHAR(MAX);
  28. SELECT @sqlstr='SELECT ''INSERT '+@tablename;
  29. SELECT @valueStr1='';
  30. SELECT @colsStr='(';
  31. SELECT @valueStr1='VALUES (''+';
  32. IF RTRIM(LTRIM(@con))=''
  33. SET @con='1=1';
  34. SELECT @valueStr1=@valueStr1+col+'+'',''+'
  35. ,@colsStr=@colsStr+'['+name +'],'
  36. FROM (
  37. SELECT
  38. CASE
  39. /* xtype=173 'binary'
  40. xtype=165 'varbinary'*/
  41. 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'
  42. /*xtype=104 'bit'*/
  43. WHEN sc.xtype =104 THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR(1),['+sc.name +'])'+' END'
  44. /*xtype=61 'datetime'
  45. xtype=58 'smalldatetime'*/
  46. WHEN sc.xtype in(58,61) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'''N''''''+'+'CONVERT(NVARCHAR(23),'+sc.name +',121)'+ '+'''''''''+' END'
  47. /*xtype=175 'char'
  48. xtype=36 'uniqueidentifier'
  49. xtype=167 'varchar'
  50. xtype=231 'nvarchar'
  51. xtype=239 'nchar'*/
  52. WHEN sc.xtype in (36,175,167,231,239) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'''N''''''+'+'REPLACE(['+sc.name+'],'''''''','''''''''''')' + '+'''''''''+' END'
  53. /*xtype=106 'decimal'
  54. xtype=108 'numeric'*/
  55. 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'
  56. /*xtype=59 'real'
  57. xtype=62 'float'*/
  58. WHEN sc.xtype in (59,62) THEN 'CASE WHEN ['+sc.name+'] is null THEN ''NULL'' ELSE '+'CONVERT(NVARCHAR(23),'+sc.name +',2)'+' END'
  59. /*xtype=48 'tinyint'
  60. xtype=52 'smallint'
  61. xtype=56 'int'
  62. xtype=127 'bigint'
  63. xtype=122 'smallmoney'
  64. xtype=60 'money'*/
  65. 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'
  66. ELSE '''NULL'''
  67. END AS col
  68. ,sc.colid
  69. ,sc.name
  70. FROM syscolumns AS sc
  71. WHERE sc.id = object_id(@tablename)
  72. AND sc.xtype <>189 --xtype=189 'timestamp'
  73. AND sc.xtype <>34 --xtype=34 'image'
  74. AND sc.xtype <>35 --xtype= 35 'text'
  75. AND (columnproperty(sc.id, sc.name, 'IsIdentity') = 0 OR @ignoreIdentityCol=0)
  76. ) AS t
  77. ORDER BY colid;
  78. SET @colsStr=left(@colsStr,len(@colsStr)-1)+') ';
  79. SET @valueStr1=left(@valueStr1,len(@valueStr1)-3)+')''';
  80. SELECT @sqlstr=@sqlstr+@colsStr+@valueStr1+' AS sql FROM '+@tablename + ' WHERE 1=1 AND ' + isnull(@con,'1=1');
  81. IF @isDebug=1
  82. BEGIN
  83. PRINT '1.columns string: '+ @colsStr;
  84. PRINT '2.values string: '+ @valueStr1
  85. PRINT '3.'+@sqlstr;
  86. END
  87.  
  88. EXEC( @sqlstr);
  89. SET NOCOUNT OFF
  90. END
  91. GO

 

示例

下来,我举一个例子帮大家理解如何使用它,假设在你的数据库中有个表Country(国家),你想得到这个表中一些数据记录的用于插入的SQL语句,记录筛选条件是列continent_name(洲名)的值为North America的记录。表的创建脚本如下:

  1. CREATE TABLE [dbo].[Country](
  2. [geoname_id] [varchar](50) NULL,
  3. [locale_code] [varchar](50) NULL,
  4. [continent_code] [varchar](50) NULL,
  5. [continent_name] [varchar](50) NULL,
  6. [country_iso_code] [varchar](50) NULL,
  7. [country_name] [varchar](50) NULL
  8. ) ON [PRIMARY]

下来,通过调用你创建的存储过程,用如下语句执行以便产生你想要的SQL的插入(INSERT)语句。调用执行脚本如下:

  1. exec sp_CreateInsertScript '[dbo].[Country]','[continent_name]=''North America'''

执行之后,你会得到你想要结果,下图为我电脑的截图。

Image 1

现在,你就可以拷贝这些结果或者通过右键菜单的选项保持输出结果为一个查询或者文本文件,以便你下来使用。Thanks!

原文链接:http://www.cnblogs.com/markkang/p/11828496.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号