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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值