首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 依條件導出表資料為 INSERT 腳本:增強版預存程序

     編輯:關於SqlServer

功能特色

  • 支援 @whereClause 過濾導出資料,避免全表導出效能問題。
  • 自動處理多 Schema 同名表(依 schema_id 排序取第一個)。
  • 完整支援資料類型轉換:字串、Unicode、日期、金額、二進位、數值、NULL。
  • 輸出標準 INSERT INTO ... VALUES (...) 格式,可直接在目標庫執行。

核心程式碼片段

CREATE PROCEDURE InsertGenerator
    @tableName NVARCHAR(MAX),
    @whereClause NVARCHAR(MAX)
AS
BEGIN
    -- 1. 解析 Schema.Table
    DECLARE @schemaName NVARCHAR(128);
    SELECT TOP 1 @schemaName = s.name
    FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id
    WHERE t.name = @tableName
    ORDER BY s.schema_id;

    -- 2. 取得欄位與類型
    DECLARE curs CURSOR FAST_FORWARD FOR
        SELECT c.name, c.system_type_id, c.max_length
        FROM sys.columns c
        WHERE c.object_id = OBJECT_ID(@schemaName + '.' + @tableName);

    -- 3. 依類型產生 VALUES 片段
    -- 字串類型:'''' + ISNULL(REPLACE(col, '''', ''''''), '''') + ''''
    -- 日期類型:'CONVERT(datetime,''' + ISNULL(CONVERT(NVARCHAR(MAX), col, 121), '''') + ''')'
    -- 金額類型:'CONVERT(money,''' + ISNULL(CONVERT(NVARCHAR(MAX), col), '0') + ''')'
    -- 二進位:'CONVERT(varbinary,' + ISNULL(CONVERT(VARCHAR(MAX), col, 1), '0x') + ')'
    -- 數值/位元:ISNULL(CONVERT(NVARCHAR(MAX), col), 'NULL')

    -- 4. 組裝動態 SQL
    SET @query = 'SELECT ''INSERT INTO [' + @schemaName + '].[' + @tableName + '](' + @cols + ') VALUES('' + ' + @vals + ' + '')'' FROM ' + @schemaName + '.' + @tableName;
    IF @whereClause IS NOT NULL AND @whereClause <> '' SET @query += ' WHERE ' + @whereClause;

    EXEC sp_executesql @query;
END

使用範例

-- 全表導出
EXEC InsertGenerator 'customer', NULL;

-- 條件導出
EXEC InsertGenerator 'customer', 'city=3 AND region=8';

全表導出結果

條件導出結果

輸出範例

INSERT INTO [dbo].[customer]([city],[region]) VALUES('1','2')
INSERT INTO [dbo].[customer]([city],[region]) VALUES('3','8')

補充:另一版本 spGenInsertSQL(支援 TOP N)

EXEC spGenInsertSQL 'customer', 2, 'city=3 AND didian=''大連''';

輸出含 N'中文'、CONVERT(money,...)、CONVERT(datetime,...) 等類型安全轉換。

避坑提醒

  • 導出腳本中所有值均以字串呈現,執行時依賴隱式/顯式轉換,目標表結構必須完全一致。
  • 大量資料建議分批導出(加 TOP),避免單一批次過大導致記憶體壓力。
  • Identity 欄位導入目標表需 SET IDENTITY_INSERT ON。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved