@whereClause 過濾導出資料,避免全表導出效能問題。schema_id 排序取第一個)。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),避免單一批次過大導致記憶體壓力。SET IDENTITY_INSERT ON。