(Sql server)用現有表中的數據創建Sql的Insert插入語句

来源:https://www.cnblogs.com/markkang/archive/2019/11/09/11828496.html
-Advertisement-
Play Games

之前,在Codeproject發表過一篇關於用現有表中數據創建Insert的Sql語句的存儲過程,今天將其搬到這裡來,註意本存儲過程僅適用於SQL SERVER。 介紹 一些時候,你想導出一些現有表中記錄的Sql腳本以便你可以插入這些數據到另一個資料庫的相似表中。有很多方式可以做到,現在,我將跟大家 ...


之前,在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

 

示例

下來,我舉一個例子幫大家理解如何使用它,假設在你的資料庫中有個表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!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using System; namespace class1 { class program { static void Main(string[] args) { //值傳遞引用,實際參數不會變化 Console.Write("請輸入a="); double a = double.Parse(Co ...
  • 前言 上一篇我們主要介紹了並行編程相關的知識,這一節我們繼續介紹關於任務相關的知識。為了更好的控制並行操作,我們可以使用System.Threading.Tasks中的Task類。我們首先來瞭解是什麼是任務——任務表示將要完成的一個或某個工作單元,這個工作單元可以在單獨線程中運行,也可以使用同步方式 ...
  • 上一篇自動化測試,全面且詳細的介紹了從零開始到發佈版本的步驟,這是傳統的方式,本次為大家帶來的是如何在5分鐘內使用上docker進行CI/CD,畢竟現在的容器化如火如荼,本示例是基於CentOS-7系統,在示例中, jenkins 和部署 .NET Core 應用程式,都使用 docker 來完成。 ...
  • 為了瞭解,上來先看幾篇中文博客進行簡單瞭解: 如何理解Nvidia英偉達的Multi-GPU多卡通信框架NCCL? 使用NCCL進行NVIDIA GPU卡之間的通信 nvidia-nccl 學習筆記 https://developer.nvidia.com/nccl (官方網站) https://g ...
  • 背景 By 魯迅 By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器,Contex A53,雙核 3. 使用工具:Source Insight 3.5, Visio 1. 概述 本文將討論 記憶體回收這個話題。 在記憶體分配出現不足時,可以通過喚醒 內核線程來非同步回收,或者通 ...
  • 解決無法定位軟體包 或 install net-tools 當我們安裝好Linux後,因為裡面有很多功能服務沒有安裝(如ifconfig、vsftpd) 所以出現一些command '***** ' not found,but can be installed with錯誤 我們就會需要安裝來使用, ...
  • 操作文件 創建文件 [root@localhost ~]# touch a.txt # 創建單個文件 [root@localhost ~]# touch b.txt c.txt # 創建多個文件 刪除文件 [root@localhost ~]# rm a.txt # 刪除單個文件 [root@loc ...
  • Mysql Join 連接查詢(中) 認識 就我平時的數據接觸來看, 連接查詢也沒有很複雜,不夠是非常需要耐心和邏輯的, 一點點將數據查出來, 拼接等. 沒有什麼技巧, 多練習就會了. 無非就是 表之間根據共同key來連接, 查詢時結合union, where, 子查詢這些... , 真的不難的, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...