本文提供 sp_GenInsert 完整可執行原始碼,自動依資料表結構產生標準化 INSERT 預存程序,含參數宣告、欄位清單、VALUES 子句,建立於 master 即可跨資料庫呼叫。
USE master;
GO
IF OBJECT_ID('sp_GenInsert', 'P') IS NOT NULL DROP PROCEDURE sp_GenInsert;
GO
CREATE PROCEDURE sp_GenInsert
@TableName VARCHAR(130),
@ProcedureName VARCHAR(130)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @maxcol INT, @TableID INT;
SET @TableID = OBJECT_ID(@TableName);
SELECT @maxcol = MAX(colorder) FROM syscolumns WHERE id = @TableID;
-- 1. 程序宣告
SELECT 'CREATE PROCEDURE ' + RTRIM(@ProcedureName) AS [text], 0 AS colorder INTO #TempProc
UNION ALL
-- 2. 參數宣告
SELECT '@' + c.name + ' ' + t.name +
CASE WHEN t.name IN ('binary','char','nchar','nvarchar','varbinary','varchar')
THEN '(' + RTRIM(CONVERT(CHAR(4), c.length)) + ')'
ELSE '' END +
CASE WHEN c.colorder < @maxcol THEN ',' ELSE ' ' END,
c.colorder
FROM syscolumns c JOIN systypes t ON c.xtype = t.xtype
WHERE c.id = @TableID AND t.name <> 'sysname'
UNION ALL
-- 3. AS 區塊
SELECT 'AS', @maxcol + 1
UNION ALL
-- 4. INSERT INTO 陳述式
SELECT 'INSERT INTO ' + @TableName, @maxcol + 2
UNION ALL
SELECT '(', @maxcol + 3
UNION ALL
-- 5. 欄位清單
SELECT c.name + CASE WHEN c.colorder < @maxcol THEN ',' ELSE ' ' END,
c.colorder + @maxcol + 3
FROM syscolumns c JOIN systypes t ON c.xtype = t.xtype
WHERE c.id = @TableID AND t.name <> 'sysname'
UNION ALL
-- 6. VALUES 子句
SELECT ')', @maxcol * 2 + 4
UNION ALL
SELECT 'VALUES (', @maxcol * 2 + 5
UNION ALL
SELECT '@' + c.name + CASE WHEN c.colorder < @maxcol THEN ',' ELSE ' ' END,
c.colorder + @maxcol * 2 + 5
FROM syscolumns c JOIN systypes t ON c.xtype = t.xtype
WHERE c.id = @TableID AND t.name <> 'sysname'
UNION ALL
SELECT ')', @maxcol * 3 + 6
ORDER BY colorder;
END;
GO
EXEC sp_GenInsert 'Employees', 'INS_Employees';
colorder 保持原始欄位順序NVARCHAR(40))text 逐行回傳,方便複製/導出IDENTITY 欄位,產出碼會包含該欄位參數,執行前需手動加上 SET IDENTITY_INSERT ON 或移除該參數WHERE c.iscomputed = 0 AND t.name <> 'timestamp'COLUMNPROPERTY(id, name, 'IsIdentity') = 1 時自動產生 SET IDENTITY_INSERT ON/OFFINSERT #TempProc EXEC sp_GenInsert ...; BCP "SELECT text FROM #TempProc ORDER BY colorder" queryout "C:\Procs\INS_Employees.sql" -c -T@SchemaName, @TableName,查詢 OBJECT_ID(@SchemaName + '.' + @TableName)