sql">-- 声明一个变量用于存储表名
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;
实测结果
差不多就行,可以会有特殊情况的错漏,再说吧......