-- 聲明一個變量用于存儲表名
DECLARE @TableName NVARCHAR(128);
-- 聲明一個游標,用于遍歷所有用戶表
DECLARE TableCursor CURSOR FOR
SELECT name FROM sys.tables WHERE type = 'U'; -- 打開游標
OPEN TableCursor;
-- 從游標中獲取第一行數據
FETCH NEXT FROM TableCursor INTO @TableName;-- 當游標獲取數據成功時,進入循環
WHILE @@FETCH_STATUS = 0
BEGIN-- 聲明一個變量用于存儲生成的創建表的 SQL 語句DECLARE @SQL NVARCHAR(MAX) = N'';-- 生成創建表的 SQL 語句,包括自增字段的處理SET @SQL = @SQL +'CREATE TABLE ' + QUOTENAME(@TableName) + ' (' +STUFF((SELECT ', ' + QUOTENAME(c.name) + ' ' + t.name +CASE WHEN t.name IN ('varchar', 'nvarchar') THEN '(' + CAST(c.max_length AS VARCHAR) + ')' WHEN t.name IN ('char', 'nchar') THEN CASE WHEN c.max_length!= -1 THEN '(' + CAST(c.max_length AS VARCHAR) + ')' ELSE '(MAX)' ENDWHEN t.name = 'decimal' THEN '(' + CAST(c.precision AS VARCHAR) + ', ' + CAST(c.scale AS VARCHAR) + ')' ELSE '' END +CASE WHEN c.is_identity = 1 THEN -- 處理自增字段' IDENTITY(' + CAST(IDENT_SEED(@TableName) AS VARCHAR) + ', ' + CAST(IDENT_INCR(@TableName) AS VARCHAR) + ')' ELSE '' END +CASE WHEN c.is_nullable = 0 THEN ' NOT NULL' ELSE '' ENDFROM sys.columns cJOIN sys.types t ON c.user_type_id = t.user_type_id WHERE c.object_id = OBJECT_ID(@TableName)FOR XML PATH('')), 1, 2, '') + ');';-- 打印生成的 SQL 語句PRINT @SQL;-- 從游標中獲取下一行數據FETCH NEXT FROM TableCursor INTO @TableName;
END-- 關閉游標
CLOSE TableCursor;
-- 釋放游標占用的資源
DEALLOCATE TableCursor;
實測結果
差不多就行,可以會有特殊情況的錯漏,再說吧......?