文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2020-08-31 11:38

关注

之前,在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
                        
                        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"                        
                        
                        WHEN sc.xtype =104 THEN "CASE WHEN ["+sc.name+"] is null THEN ""NULL"" ELSE "+"CONVERT(NVARCHAR(1),["+sc.name +"])"+" END"                        
                        
                        WHEN sc.xtype in(58,61) THEN "CASE WHEN ["+sc.name+"] is null THEN ""NULL"" ELSE "+"""N""""""+"+"CONVERT(NVARCHAR(23),"+sc.name +",121)"+ "+"""""""""+" END"
                        
                        WHEN sc.xtype in (36,175,167,231,239) THEN "CASE WHEN ["+sc.name+"] is null THEN ""NULL"" ELSE "+"""N""""""+"+"REPLACE(["+sc.name+"],"""""""","""""""""""")" + "+"""""""""+" END"
                        
                        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"
                        
                        WHEN sc.xtype in (59,62) THEN "CASE WHEN ["+sc.name+"] is null THEN ""NULL"" ELSE "+"CONVERT(NVARCHAR(23),"+sc.name +",2)"+" END"
                        
                        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"""

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

Image 1

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯