`
tianshibaijia
  • 浏览: 1152914 次
文章分类
社区版块
存档分类
最新评论

SYBASE中生成所有建表语句的过程

 
阅读更多

Sql代码:

  1. ifexists(select1fromsysobjectswherename='sp_gent'andtype='P')
  2. dropproceduresp_gent
  3. go
  4. createproceduresp_gent
  5. @tblnamevarchar(30)=null,
  6. @precharvarchar(4)=null,--$:noprint
  7. @table_dllvarchar(16384)=nullout,
  8. @dbnamevarchar(32)=null,
  9. @droptgchar(1)='1',
  10. @prxytxvarchar(255)=null,
  11. @replacevarchar(20)=null,
  12. @tabtypevarchar(1)='A',--A:所有表;P:代理表;U:用户表
  13. @indextgvarchar(3)='TPI',--T:纯表;P:主键;I:纯索引;J:除主键外的纯索引(和TP使用与I相同,和I同时使用I失效)
  14. @table_segvarchar(32)=null,
  15. @index_segvarchar(32)=null
  16. as
  17. begin
  18. setnocounton
  19. if@tblnameisnullbegin
  20. declare@c_tblnamevarchar(30)
  21. declarecur_1cursorfor
  22. selectnamefromsysobjectswheretype='U'orderbyname
  23. opencur_1
  24. fetchcur_1into@c_tblname
  25. while@@sqlstatus=0begin
  26. execsp_gent
  27. @tblname=@c_tblname,
  28. @prechar=@prechar,
  29. @dbname=@dbname,
  30. @droptg=@droptg,
  31. @prxytx=@prxytx,
  32. @replace=@replace,
  33. @tabtype=@tabtype,--A:所有表;P:代理表;U:用户表
  34. @indextg=@indextg,--A:表和索引;T:纯表;I:纯索引
  35. @table_seg=@table_seg,
  36. @index_seg=@index_seg
  37. fetchcur_1into@c_tblname
  38. end
  39. closecur_1
  40. deallocatecursorcur_1
  41. return
  42. end
  43. declare@obj_idint
  44. declare@sysstat2int
  45. declare@usernamevarchar(30)
  46. select@obj_id=id,@sysstat2=sysstat2,@username=user_name(uid)
  47. fromsysobjectswherename=@tblnameandtype='U'
  48. if@@rowcount<>1
  49. begin
  50. print'table%1!notexists',@tblname
  51. gotoerr
  52. end
  53. if@sysstat2&1024=1024begin
  54. ifupper(@tabtype)in('U')
  55. gotook
  56. end
  57. elsebegin
  58. ifupper(@tabtype)in('P')
  59. gotook
  60. end
  61. declare@colnamevarchar(30)--列名
  62. declare@typenamevarchar(30)--类型名称
  63. declare@usertypesmallint--类型ID
  64. declare@lengthint--长度
  65. declare@prectinyint--有效位数
  66. declare@scaletinyint--精度
  67. declare@def_idint--默认值id
  68. declare@nullstinyint--空值
  69. declare@identtinyint--标识列
  70. declare@index_dllvarchar(16384)
  71. declare@def_textvarchar(100)
  72. declare@ide_textvarchar(30)
  73. declare@nul_textvarchar(30)
  74. declare@cns_textvarchar(500)
  75. declare@uni_privarchar(40),@non_cluvarchar(40),@non_univarchar(40)
  76. declare@lock_schemevarchar(100)
  77. declare@keysvarchar(500),@iint
  78. declare@thiskeyvarchar(30)
  79. declare@sorderchar(4)
  80. select@keys="",@i=1
  81. declare@cns_namevarchar(30),@statusint,@indidint
  82. declare@idx_namevarchar(50)
  83. declare@CRNWvarchar(2)--回车换行
  84. declare@TABchar(1)
  85. select@CRNW=convert(varchar(2),0x0d0a)
  86. select@TAB=convert(char(1),0x09)
  87. declare@dbname_dotvarchar(35)
  88. ifltrim(@dbname)isnull
  89. select@dbname=null,@dbname_dot=null
  90. else
  91. select@dbname=@dbname+'.',@dbname_dot=@dbname+'..'
  92. declare@table_namevarchar(30)
  93. select@table_name=casewhenltrim(@replace)isnotnullthen@replaceelse@tblnameend
  94. declare@prefix_tablevarchar(2)
  95. select@prefix_table=casewhenltrim(@prxytx)isnotnullthen'r_'elsenullend
  96. ifcharindex('T',@indextg)>0begin
  97. if@droptg<>'0'
  98. select@table_dll="ifexists(select1from"+@dbname_dot
  99. +"sysobjectswherename='"+@prefix_table
  100. +@table_name+"'andtype='U')"
  101. +@CRNW+@TAB+'droptable'+@dbname+@username+'.'
  102. +@prefix_table
  103. +@table_name+@CRNW
  104. +casewhen@sysstat2&1024=1024
  105. then@TAB+'execsp_dropobjectdef'+@table_name+@CRNW
  106. whenltrim(@prxytx)isnotnull
  107. then@TAB+'execsp_dropobjectdefr_'+@table_name+@CRNW
  108. elsenull
  109. end
  110. +'go'+@CRNW
  111. else
  112. select@table_dll=null
  113. if@sysstat2&1024=1024begin
  114. declare@OS_filevarchar(255)
  115. select@OS_file=char_valuefromsysattributes
  116. whereclass=9andattribute=1and
  117. object_cinfo=@tblname
  118. if@@rowcount=0begin
  119. print'取代理表前缀失败%1!',@tblname
  120. gotoerr
  121. end
  122. select@table_dll=@table_dll+"execsp_addobjectdef"
  123. +@table_name
  124. +",'"+@OS_file+"','table'"+@CRNW+
  125. "createexistingtable"+@dbname+@username+"."
  126. +@table_name+"("
  127. end
  128. elseifltrim(@prxytx)isnotnull
  129. select@table_dll=@table_dll+"execsp_addobjectdefr_"
  130. +@table_name+",'"+@prxytx
  131. +@table_name+"','table'"+@CRNW
  132. +"createexistingtable"+@dbname+@username+".r_"
  133. +@table_name+"("
  134. else
  135. select@table_dll=@table_dll+'createtable'+@dbname+@username+'.'
  136. +@table_name+'('
  137. --如果在sybsystemprocs数据库下提交,以下注释掉
  138. declare@tablnavarchar(255)
  139. --select@tablna=tablnafromknp_tablwheretablcd=@tblname
  140. --if@@rowcount=0
  141. select@tablna=null
  142. ifltrim(@tablna)isnotnull
  143. select@table_dll=@table_dll+'--'+@tablna
  144. select@prechar=casewhen@precharisnotnullthenleft(@prechar+space(4),4)else@precharend
  145. if@prechar<>'$'begin
  146. if@precharisnotnullbegin
  147. declare@temp_dllvarchar(16384),@print_dllvarchar(16384)
  148. select@temp_dll=@table_dll
  149. select@temp_dll=@prechar+@temp_dll
  150. whilecharindex(@CRNW,@temp_dll)>0andchar_length(@temp_dll)<>charindex(@CRNW,@temp_dll)+1begin
  151. select@print_dll=@print_dll+left(@temp_dll,charindex(@CRNW,@temp_dll)-1)+@CRNW+@prechar
  152. select@temp_dll=substring(@temp_dll,charindex(@CRNW,@temp_dll)+char_length(@CRNW),char_length(@temp_dll))
  153. end
  154. select@print_dll=@print_dll+@temp_dll
  155. print'%1!',@print_dll
  156. end
  157. else
  158. print'%1!',@table_dll
  159. end
  160. select@table_dll=@table_dll+@CRNW
  161. ifltrim(@table_seg)isnullbegin
  162. select@table_seg=s.name
  163. fromsysobjectso,syssegmentss,sysindexesi
  164. whereo.id=object_id(@tblname)
  165. andi.id=o.id
  166. andi.indid<2
  167. andi.segment=s.segment
  168. if@@rowcount=0begin
  169. print'表%1!所在的段不存在',@tblname
  170. gotoerr
  171. end
  172. end
  173. end
  174. --确定表是否有完整性约束
  175. declare@have_conchar(1)
  176. ifexists(select1fromsysindexeswhereid=@obj_idandstatus2&2=2)
  177. and(ltrim(@prxytx)isnullor@sysstat2&1024=1024)
  178. select@have_con='1'
  179. else
  180. select@have_con='0'
  181. ifcharindex('T',@indextg)>0begin
  182. declare@col_intint
  183. select@col_int=count(*)fromsyscolumns
  184. whereid=@obj_id
  185. declarecur_colcursorfor
  186. selectb.name,b.usertype,c.name,b.length,b.prec,b.scale,b.cdefault,
  187. convert(bit,b.status&8)asNulls,
  188. convert(bit,b.status&128)asIdent
  189. fromsysobjectsa,syscolumnsb,systypesc
  190. wherea.name=@tblnameanda.type='U'
  191. anda.id=b.id
  192. andb.usertype=c.usertype
  193. orderbyb.colid
  194. opencur_col
  195. fetchcur_colinto@colname,@usertype,@typename,@length,@prec,@scale,@def_id,@nulls,@ident
  196. while@@sqlstatus=0
  197. begin
  198. --系统定义的数据类型
  199. if@usertype<100
  200. begin
  201. ifrtrim(@typename)in('char','varchar','nchar','nvarchar')
  202. select@typename=@typename+'('+convert(varchar,@length)+')'
  203. elseif@typenamein('numeric','decimal')
  204. select@typename=@typename+'('+convert(varchar,@prec)+','+convert(varchar,@scale)+')'
  205. elseif@typenamein('float','double')
  206. select@typename=@typename+'('+convert(varchar,@prec)+')'
  207. elseif@typenamein('binary','varbinary')
  208. select@typename=@typename+'('+convert(varchar,@length)+')'
  209. end
  210. select@ide_text=case@identwhen1then'identity'elsenullend
  211. select@nul_text=case@nullswhen1then'null'else'notnull'end
  212. if@def_id>0
  213. begin
  214. select@def_text=ltrim(rtrim(b.text))
  215. fromsysobjectsa,syscommentsb
  216. wherea.id=@def_idanda.id=b.id
  217. if@@rowcount<>1
  218. begin
  219. print'取default失败%1!',@def_id
  220. gotoerr
  221. end
  222. whilecharindex(@TAB,@def_text)>0
  223. select@def_text=stuff(@def_text,charindex(@TAB,@def_text),char_length(@TAB),'')
  224. whilecharindex('',@def_text)>0
  225. select@def_text=stuff(@def_text,charindex('',@def_text),char_length(''),'')
  226. select@def_text=rtrim(ltrim(@def_text))
  227. end
  228. else
  229. select@def_text=null
  230. declare@thiscolvarchar(500)
  231. select@thiscol=
  232. casewhenchar_length(@colname)<=10thenleft(@colname+space(10),10)else@colnameend
  233. +''+casewhenchar_length(@typename)<=15thenleft(@typename+space(15),15)else@typenameend
  234. +''+@def_text
  235. +''+@ide_text
  236. +''+@nul_text
  237. if@i=@col_intand(@have_con='0'orcharindex('P',@indextg)<=0)
  238. select@thiscol=@thiscol+''
  239. else
  240. select@thiscol=@thiscol+','
  241. --如果在sybsystemprocs数据库下提交,以下注释掉
  242. declare@colmnavarchar(255)
  243. select@colmna=null
  244. --select@colmna=colmnafromknp_colmwheretablcd=@tblnameandcolmcd=@colname
  245. ifltrim(@colmna)isnotnull
  246. select@thiscol=@thiscol+'--'+@colmna
  247. if@prechar<>'$'
  248. print'%1!%2!',@prechar,@thiscol
  249. select@table_dll=@table_dll+@thiscol+@CRNW
  250. select@i=@i+1
  251. fetchcur_colinto@colname,@usertype,@typename,@length,@prec,@scale,@def_id,@nulls,@ident
  252. end
  253. end
  254. if@have_con='1'andcharindex('P',@indextg)>0
  255. begin
  256. select@cns_name=name,@status=status,@indid=indid
  257. fromsysindexeswhereid=@obj_idandstatus2&2=2
  258. --print'existconstraint...status=%1!',@status
  259. if@indid=1
  260. select@non_clu='clustered'
  261. elseif@indid>1
  262. begin
  263. if@status&16=16
  264. select@non_clu='clustered'
  265. else
  266. select@non_clu='nonclustered'
  267. end
  268. if@status&2048=2048
  269. select@uni_pri='primarykey'
  270. else
  271. select@uni_pri='unique'
  272. select@cns_text='constraint'+@cns_name+''+@uni_pri+''+@non_clu
  273. select@i=1,@keys=''
  274. select@thiskey=index_col(@tblname,@indid,@i)
  275. while@thiskey<>null
  276. begin
  277. if@i>1
  278. begin
  279. select@keys=@keys+","
  280. end
  281. ifltrim(@keys)isnull
  282. select@keys=@thiskey
  283. else
  284. select@keys=@keys+@thiskey
  285. select@sorder=index_colorder(@tblname,@indid,@i)
  286. if(@sorder="DESC")
  287. select@keys=@keys+""+@sorder
  288. select@i=@i+1
  289. select@thiskey=index_col(@tblname,@indid,@i)
  290. end
  291. select@cns_text=@cns_text+'('+@keys+')'
  292. ifltrim(@table_seg)isnullbegin
  293. select@table_seg=s.name
  294. fromsysobjectso,syssegmentss,sysindexesi
  295. whereo.id=object_id(@tblname)
  296. andi.id=o.id
  297. andi.indid<2
  298. andi.segment=s.segment
  299. if@@rowcount=0begin
  300. print'表%1!所在的段不存在',@tblname
  301. gotoerr
  302. end
  303. end
  304. ifcharindex('T',@indextg)<=0
  305. select@cns_text='altertable'+@dbname+@username+'.'+@table_name+'add'+@cns_text+"on'"+@table_seg+"'"
  306. if@prechar<>'$'
  307. print'%1!%2!',@prechar,@cns_text
  308. select@table_dll=@table_dll+@cns_text
  309. end
  310. ifcharindex('T',@indextg)>0begin
  311. if@prechar<>'$'
  312. print'%1!%2!',@prechar,')'
  313. select@table_dll=left(@table_dll,char_length(@table_dll)-1)+@CRNW+')'
  314. --表锁计划
  315. if@sysstat2&8192=8192
  316. select@lock_scheme='lockallpages'
  317. elseif@sysstat2&16384=16384
  318. select@lock_scheme='lockdatapages'
  319. elseif@sysstat2&32768=32768
  320. select@lock_scheme='lockdatarows'
  321. select@table_dll=@table_dll+@CRNW+@lock_scheme
  322. if@prechar<>'$'
  323. print'%1!%2!',@prechar,@lock_scheme
  324. select@table_seg="on'"+@table_seg+"'"
  325. select@table_dll=@table_dll+@CRNW+@table_seg+@CRNW+'go'+@CRNW
  326. if@prechar<>'$'begin
  327. print'%1!%2!',@prechar,@table_seg
  328. print'%1!go',@prechar
  329. end
  330. end
  331. ifltrim(@prxytx)isnotnullor@sysstat2&1024=1024
  332. gotook
  333. ifcharindex('T',@indextg)>0begin
  334. declare@part_numint,@partitionvarchar(255)
  335. select@part_num=count(*)
  336. fromsyspartitions
  337. whereid=object_id(@tblname)
  338. if@part_num<>0begin
  339. select@partition='altertable'+@username+'.'+@table_name+'partition'+convert(varchar,@part_num)
  340. select@table_dll=@table_dll+@CRNW+@partition
  341. if@prechar<>'$'
  342. print'%1!%2!',@prechar,@partition
  343. end
  344. end
  345. --select@table_dllastable_dll
  346. -------------------------------------------------------------------------------------
  347. --检查其他索引
  348. declare@idx_segvarchar(32)
  349. ifcharindex('I',@indextg)>0orcharindex('J',@indextg)>0begin
  350. ifexists(select1fromsysindexeswhereid=@obj_idandindid<>0and
  351. (status2&2<>2orcharindex('P',@indextg)<=0andcharindex('J',@indextg)<=0))
  352. begin
  353. declarecur_idxcursorfor
  354. selectname,indid,statusfromsysindexes
  355. whereid=@obj_idandindid<>0and
  356. (status2&2<>2orcharindex('P',@indextg)<=0andcharindex('J',@indextg)<=0)
  357. --(status2&2<>2orcharindex('P',@indextg)<=0)
  358. opencur_idx
  359. fetchcur_idxinto@idx_name,@indid,@status
  360. while@@sqlstatus=0
  361. begin
  362. if@indid=1
  363. select@non_clu='clustered'
  364. elseif@indid>1
  365. begin
  366. if@status&16=16
  367. select@non_clu='clustered'
  368. else
  369. select@non_clu='nonclustered'
  370. end
  371. if@status&2=2
  372. select@non_uni='unique'
  373. else
  374. select@non_uni=null
  375. select@i=1,@keys=''
  376. select@thiskey=index_col(@tblname,@indid,@i)
  377. while@thiskey<>null
  378. begin
  379. if@i>1
  380. begin
  381. select@keys=@keys+","
  382. end
  383. ifltrim(@keys)isnull
  384. select@keys=@thiskey
  385. else
  386. select@keys=@keys+@thiskey
  387. select@sorder=index_colorder(@tblname,@indid,@i)
  388. if@sorder="DESC"
  389. select@keys=@keys+""+@sorder
  390. select@i=@i+1
  391. select@thiskey=index_col(@tblname,@indid,@i)
  392. end
  393. ifltrim(@index_seg)isnullbegin
  394. select@idx_seg=s.name
  395. fromsyssegmentss,sysindexesi
  396. wheres.segment=i.segment
  397. andi.id=object_id(@tblname)
  398. andi.indid=@indid
  399. if@@rowcount=0begin
  400. print'索引%1!所在的段不存在',@idx_name
  401. gotoerr
  402. end
  403. end
  404. else
  405. select@idx_seg=@index_seg
  406. ifltrim(@keys)isnotnullbegin
  407. declare@thisidxvarchar(500)
  408. select@thisidx='create'+@non_uni
  409. +@non_clu+'index'+@idx_name+'on'+@dbname+@username
  410. +'.'+@table_name+"("+@keys+")on'"+@idx_seg+"'"
  411. select@index_dll=@index_dll+@thisidx+@CRNW
  412. if@prechar<>'$'
  413. print'%1!%2!',@prechar,@thisidx
  414. end
  415. fetchcur_idxinto@idx_name,@indid,@status
  416. end
  417. ifltrim(@index_dll)isnotnullbegin
  418. if@droptg<>'0'begin
  419. select@index_dll=@index_dll+'go'+@CRNW
  420. if@prechar<>'$'
  421. print'%1!go',@prechar
  422. end
  423. end
  424. select@table_dll=@table_dll+@CRNW+@index_dll
  425. end
  426. end
  427. ok:
  428. setnocountoff
  429. return0
  430. err:
  431. setnocountoff
  432. return-1
  433. end
  434. go
  435. 小结:不足之处当DDL脚本超过16384时,将被截断,此时需要通过ddlgen语法来生成
  436. 见我的blog:sybase 导出DDL语句以及ddlgen的描述
  437. http://blog.csdn.net/xujinyang/article/details/6871003

分享到:
评论

相关推荐

    sybase库中导出全部表的oracle、mysql和sybase的建表语句

    `java`在这里扮演了工具开发的角色,开发者可以利用Java的强类型和丰富的库来构建一个自动化脚本,遍历所有表并生成建表语句。DbGenSqlUtil很可能是一个Java工具类,用于处理这个任务。它可能包含了连接数据库、执行...

    在SYBASE中用于生当前数据库中所有表的建表语句的过程

    在SYBASE中用于生当前数据库中所有表的建表语句的过程。 在系统备份的加上BCP,那是相当的好。

    sybase导出建表SQL工具

    标题中的“sybase导出建表SQL工具”指的是一个专门针对Sybase数据库系统的应用程序,它的主要功能是帮助用户方便地导出数据库中的表结构定义,即建表SQL语句。在数据库管理中,建表SQL语句是创建数据库表结构的关键...

    powerdesigner 生成备注方法

    以下是一个示例脚本,用于遍历当前模型中的所有表格、字段和视图,并将其名称设置为备注: ```vbscript Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' 当前模型 mdl = ...

    SAP HANA master 指南

    - **实时分析**:能够在交易过程中实时分析数据,为企业决策提供即时支持。 - **统一平台**:将数据仓库、数据湖和应用程序服务器功能集成到一个平台上。 - **广泛的应用集成**:支持多种SAP应用及第三方应用程序的...

    powerdesigner资料

    ### PowerDesigner基础知识与实践应用详解 #### 一、PowerDesigner简介...在实际应用过程中,应当注意遵循最佳实践,比如在建表语句中避免不必要的双引号使用,以及充分利用PowerDesigner提供的正向和反向工程等功能。

    powerdesigner为表设置表空间

    在 Oracle 数据库设计过程中,合理地规划和使用表空间对于提高数据库性能、优化磁盘空间使用率至关重要。例如,可以将经常访问的数据放在高性能磁盘上的表空间中,而将不常用的数据存放在较低性能的磁盘上,以此来...

    sybaseiq数据库迁移实例.pdf

    - **Copy出建表SQL**:通过SQL语句复制表的结构,创建新的表定义。 - **使用PowerDesigner反向工程导出SQL**:PowerDesigner是一款强大的数据库设计工具,可帮助用户从现有数据库中生成建模脚本,便于在新环境中...

    PowerDesigner12.5直接从DB中导出pdm文件.doc

    PowerDesigner12.5 直接从 DB 中导出 pdm 文件 PowerDesigner12.5 是一款功能强大且广泛应用的...使用 PowerDesigner12.5 直接从 DB 中导出 pdm 文件可以快速、方便地生成数据库结构图,并简化数据库设计和管理过程。

    Penguins DbTools v16.11.27 官方正式版.zip

    根据EXCEL中的表结构,生成建表语句SQL文。 6。多用户使用该软件时,可以随时记录某个用户对数据库的操作。 7。可以为进行压力测试,自动生成数据。 8。导出表结构,根据表结构和数据库中的表结构进行差分。 9。...

    PowerDesigner反向工程将数据库设计导出SQL脚本、HTML或World

    解决 Oracle 生成的 SQL 创建语句中的双引号问题 在使用 PowerDesigner 导出 Oracle 数据库的建表 SQL 时,默认情况下,PowerDesigner 会为表名和字段名添加双引号,这可能会给数据库操作带来不便。要解决这个问题...

    PowerDesinger设置集锦.docx

    在生成建表脚本时,可以选择不进行检查,或者修改 C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\DBMS 中的设置。 本文总结了 PowerDesigner 的一些常用设置和技巧,希望能够帮助读者更好地使用 ...

    sybase ASE15性能调优(2)

    通过对Sybase ASE15中的系统参数配置、数据库设计及查询计划的深入了解与优化,可以显著提升数据库的运行效率和响应速度。这些技术不仅限于Sybase ASE15,很多原则也适用于其他数据库管理系统。实践中应综合考虑各种...

    SQL21日自学通

    在一个SELECT 语句中使用多个表119 正确地找到列123 等值联合124 不等值联合129 外部联合与内部联合130 表的自我联合132 总结134 问与答134 校练场134 练习135 第七天子查询内嵌的SQL 子句136 目标136 建立一个子...

    PowerDesigner15的简单使用方法

    PowerDesigner从最初的单一数据库设计工具演化为一个全方位的建模工具软件,涵盖了管理信息系统设计的全过程,包括数据流程图、概念数据模型、物理数据模型的制作,以及生成建表程序、存储过程、触发器框架等。...

    Powerdesign高级配置[归纳].pdf

    一、去掉 Oracle 生成的 SQL 创建语句中的双引号 在 PowerDesign 里,导出 Oracle 数据库的建表 SQL 时,默认会给表名和字段名加上双引号。解决方法是设置 Database 菜单,然后点击 Edit Current DBMS 菜单,再依次...

    PowerDesigner使用手册(内部)

    生成建表脚本是将PDM模型转化为数据库创建语句,以便在数据库中实施。在PDM中,选择“数据库”&gt;“生成”&gt;“SQL脚本”,定制脚本选项,如表空间、存储过程等。 5. PDM生成REPORT REPORT功能用于创建模型报告,展示...

    PowerDesinger使用小技巧定义.pdf

    - 当你在SQL语句中遇到表名和字段名被引号包围导致大小写敏感问题时,可以在`Tools`菜单下选择`Model Options`,然后在`Naming Convention`选项中,调整`Name`和`Code`的`Character Case`设置为`Uppercase`或`...

Global site tag (gtag.js) - Google Analytics