DECLARE
@tabName VARCHAR(50),
@tabDes VARCHAR(50),
-- 内层游标变量(字段信息)
@colName VARCHAR(50),
@colType VARCHAR(50),
@colLen int,
@colIsNull int,
@colDes VARCHAR(200),
@colStr varchar(MAX)='';
-- 声明游标
DECLARE tab_cursor CURSOR FOR
SELECT DISTINCT
d.name,
f.value
FROM
syscolumns a
LEFT JOIN systypes b ON a.xusertype= b.xusertype
INNER JOIN sysobjects d ON a.id= d.id
AND d.xtype= 'U'
AND d.name<> 'dtproperties'
LEFT JOIN syscomments e ON a.cdefault= e.id
LEFT JOIN sys.extended_properties g ON a.id= G.major_id
AND a.colid= g.minor_id
LEFT JOIN sys.extended_properties f ON d.id= f.major_id
AND f.minor_id= 0;
-- 打开游标
OPEN tab_cursor;
-- 获取第一行数据
FETCH NEXT FROM tab_cursor INTO @tabName, @tabDes;
-- 循环读取游标数据
WHILE @@FETCH_STATUS = 0
BEGIN
-- select @tabName,@tabDes
-- PRINT '信息:' +@tabName + ',' + ISNULL(@tabDes, '');
--初始化字段
set @colStr=''
set @colStr=@colStr+''
set @colStr=@colStr+'CREATE TABLE '+@tabName+'('+ CHAR(13) + CHAR(10)
SELECT CAST(a.name AS VARCHAR(200)) as name,
CAST(b.name AS VARCHAR(200)) as type,
CAST(COLUMNPROPERTY(a.id,a.name,'PRECISION') AS INT) as len,
(a.isnullable) as colisnull,
CAST( isnull(g.[value],'') AS VARCHAR(200)) as des
into #colTab
FROM
syscolumns a
left join
systypes b
on
a.xusertype=b.xusertype
inner join
sysobjects d
on
a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join
syscomments e
on
a.cdefault=e.id
left join
sys.extended_properties g
on
a.id=G.major_id and a.colid=g.minor_id
left join
sys.extended_properties f
on
d.id=f.major_id and f.minor_id=0
where
d.name=@tabName
order by
a.id,a.colorder
-- 2. 定义内层游标(遍历当前客户的订单)
DECLARE Inner_Cursor CURSOR FOR
select * from #colTab
-- 打开内层游标
OPEN Inner_Cursor;
-- 获取内层游标第一行数据
FETCH NEXT FROM Inner_Cursor INTO @colName, @colType,@colLen,@colIsnull, @colDes;
-- 内层游标循环
WHILE @@FETCH_STATUS = 0
BEGIN
-- 输出字段信息
--PRINT '字段信息:'+ @colName+','+ @colType+','+@colLen+','+@colDes;
if(@colName!='aysnId' AND @colName!='id')
BEGIN
set @colStr=@colStr+','
END
set @colStr=@colStr+@colName+' '
--判断字段类型
if(@colType='nvarchar')
BEGIN
if(@colLen>800)
BEGIN
set @colStr=@colStr+' longtxt'
END
ELSE
BEGIN
set @colStr=@colStr+' varchar('+ CAST(@colLen as VARCHAR)+')'
END
END
else if(@colType='money')
BEGIN
set @colStr=@colStr+' decimal(18,10)'
END
else
BEGIN
set @colStr=@colStr+' '+@colType
END
--主键判断
if(@colName='aysnId' or @colName='id')
BEGIN
set @colStr=@colStr+' UNSIGNED '
END
--非空判断
if(@colIsnull=1)
BEGIN
set @colStr=@colStr+' Null'
END
ELSE
BEGIN
set @colStr=@colStr+' Not Null'
END
--主键判断
if(@colName='aysnId' or @colName='id')
BEGIN
set @colStr=@colStr+' AUTO_INCREMENT PRIMARY KEY '
END
set @colStr=@colStr+' COMMENT "'+@colDes+'"'+ CHAR(13) + CHAR(10)
--获取内层游标下一行数据
FETCH NEXT FROM Inner_Cursor INTO @colName, @colType,@colLen,@colIsnull, @colDes;
END;
-- 关闭并释放内层游标(必须在每次外层循环结束后释放)
CLOSE Inner_Cursor;
DEALLOCATE Inner_Cursor;
DROP TABLE #colTab
set @colStr=@colStr+')ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;'+ CHAR(13) + CHAR(10)
PRINT @colStr
-- 获取下一行数据
FETCH NEXT FROM tab_cursor INTO @tabName, @tabDes;
END;
-- 关闭并释放游标
CLOSE tab_cursor;
DEALLOCATE tab_cursor;
sql表转mysql语句
于 2025-11-21 13:38:43 首次发布
2003

被折叠的 条评论
为什么被折叠?



