分享
 
 
 

MS SQLSERVER 中如何得到表的创建语句

王朝mssql·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

MS SQLSERVER 只能得到存储过程的创建语句,方法如下:

sp_helptext procedureName

但是往往我们需要得到表的创建语句,比如说在数据库升级的时候判断某个表是否已经改变,或者已经有一个表存在,但不知道它的创建语句是什么,字段有没有约束,有没有主键,创建了哪些索引等等.下面我给出一个存储过程,供读者参考.

该存储过程可以得到你想得到的所有的表的创建语句,包括和表有关的索引的创建语句.

SQLSERVER2000 下的代码

create procedure SP_GET_TABLE_INFO

@ObjName varchar(128) /* The table to generate sql script */

as

declare @Script varchar(255)

declare @ColName varchar(30)

declare @ColID TinyInt

declare @UserType smallint

declare @TypeName sysname

declare @Length TinyInt

declare @Prec TinyInt

declare @Scale TinyInt

declare @Status TinyInt

declare @cDefault int

declare @DefaultID TinyInt

declare @Const_Key varchar(255)

declare @IndID SmallInt

declare @IndStatus Int

declare @Index_Key varchar(255)

declare @DBName varchar(30)

declare @strPri_Key varchar (255)

/*

** Check to see the the table exists and initialize @objid.

*/

if not Exists(Select name from sysobjects where name = @ObjName)

begin

select @DBName = db_name()

raiserror(15009,-1,-1,@ObjName,@DBName)

return (1)

end

create table #spscript

(

id int IDENTITY not null,

Script Varchar(255) NOT NULL,

LastLine tinyint

)

declare Cursor_Column INSENSITIVE CURSOR

for Select a.name,a.ColID,a.usertype,b.name,a.length,a.prec,a.scale,a.Status, a.cDefault,

case a.cdefault when 0 then ' ' else (select c.Text from syscomments c where a.cdefault = c.id) end const_key

from syscolumns a, systypes b where object_name(a.id) = @ObjName

and a.usertype = b.usertype order by a.ColID

set nocount on

Select @Script = 'Create table ' + @ObjName + '('

Insert into #spscript values(@Script,0)

/* Get column information */

open Cursor_Column

fetch next from Cursor_Column into @ColName,@ColID,@UserType,@TypeName,@Length,@Prec,@Scale,

@Status,@cDefault,@Const_Key

Select @Script = ''

while (@@FETCH_STATUS <> -1)

begin

if (@@FETCH_STATUS <> -2)

begin

Select @Script = @ColName + ' ' + @TypeName

if @UserType in (1,2,3,4)

Select @Script = @Script + '(' + Convert(char(3),@Length) + ') '

else if @UserType in (24)

Select @Script = @Script + '(' + Convert(char(3),@Prec) + ','

+ Convert(char(3),@Scale) + ') '

else

Select @Script = @Script + ' '

if ( @Status & 0x80 ) > 0

Select @Script = @Script + ' IDENTITY(1,1) '

if ( @Status & 0x08 ) > 0

Select @Script = @Script + ' NULL '

else

Select @Script = @Script + ' NOT NULL '

if @cDefault > 0

Select @Script = @Script + ' DEFAULT ' + @Const_Key

end

fetch next from Cursor_Column into @ColName,@ColID,@UserType,@TypeName,@Length,@Prec,@Scale,

@Status,@cDefault,@Const_Key

if @@FETCH_STATUS = 0

begin

Select @Script = @Script + ','

Insert into #spscript values(@Script,0)

end

else

begin

Insert into #spscript values(@Script,1)

Insert into #spscript values(')',0)

end

end

Close Cursor_Column

Deallocate Cursor_Column

/* Get index information */

Declare Cursor_Index INSENSITIVE CURSOR

for Select name,IndID,status from sysindexes where object_name(id)=@ObjName

and IndID > 0 and IndID<>255 order by IndID /*增加了对InDid为255的判断*/

Open Cursor_Index

Fetch Next from Cursor_Index into @ColName, @IndID, @IndStatus

while (@@FETCH_STATUS <> -1)

begin

if @@FETCH_STATUS <> -2

begin

declare @i TinyInt

declare @thiskey varchar(50)

declare @IndDesc varchar(68) /* string to build up index desc in */

Select @i = 1

while (@i <= 16)

begin

select @thiskey = index_col(@ObjName, @IndID, @i)

if @thiskey is null

break

if @i = 1

select @Index_Key = index_col(@ObjName, @IndID, @i)

else

select @Index_Key = @Index_Key + ', ' + index_col(@ObjName, @IndID, @i)

select @i = @i + 1

end

if (@IndStatus & 0x02) > 0

Select @Script = 'Create unique '

else

Select @Script = 'Create '

if @IndID = 1

select @Script = @Script + ' clustered '

if (@IndStatus & 0x800) > 0

select @strPri_Key = ' PRIMARY KEY (' + @Index_Key + ')'

else

select @strPri_Key = ''

if @IndID > 1

select @Script = @Script + ' nonclustered '

Select @Script = @Script + ' index ' + @ColName + ' ON '+ @ObjName

+ '(' + @Index_Key + ')'

Select @IndDesc = ''

/*

** See if the index is ignore_dupkey (0x01).

*/

if @IndStatus & 0x01 = 0x01

Select @IndDesc = @IndDesc + ' IGNORE_DUP_KEY' + ','

/*

** See if the index is ignore_dup_row (0x04).

*/

/* if @IndStatus & 0x04 = 0x04 */

/* Select @IndDesc = @IndDesc + ' IGNORE_DUP_ROW' + ',' */ /* 2000 不在支持*/

/*

** See if the index is allow_dup_row (0x40).

*/

if @IndStatus & 0x40 = 0x40

Select @IndDesc = @IndDesc + ' ALLOW_DUP_ROW' + ','

if @IndDesc <> ''

begin

Select @IndDesc = SubString( @IndDesc, 1, DataLength(@IndDesc) - 1 )

Select @Script = @Script + ' WITH ' + @IndDesc

end

/*

** Add the location of the data.

*/

end

if (@strPri_Key = '')

Insert into #spscript values(@Script,0)

else

update #spscript set Script = Script + @strPri_Key where LastLine = 1

Fetch Next from Cursor_Index into @ColName, @IndID, @IndStatus

end

Close Cursor_Index

Deallocate Cursor_Index

Select Script from #spscript

set nocount off

return (0)

SQLSERVER6.5下的代码

create procedure SP_GET_TABLE_INFO

@ObjName varchar(128) /* The table to generate sql script */

as

declare @Script varchar(255)

declare @ColName varchar(30)

declare @ColID TinyInt

declare @UserType smallint

declare @TypeName sysname

declare @Length TinyInt

declare @Prec TinyInt

declare @Scale TinyInt

declare @Status TinyInt

declare @cDefault int

declare @DefaultID TinyInt

declare @Const_Key varchar(255)

declare @IndID SmallInt

declare @IndStatus SmallInt

declare @Index_Key varchar(255)

declare @Segment SmallInt

declare @DBName varchar(30)

declare @strPri_Key varchar (255)

/*

** Check to see the the table exists and initialize @objid.

*/

if not Exists(Select name from sysobjects where name = @ObjName)

begin

select @DBName = db_name()

raiserror(15009,-1,-1,@ObjName,@DBName)

return (1)

end

create table #spscript

(

id int IDENTITY not null,

Script Varchar(255) NOT NULL,

LastLine tinyint

)

declare Cursor_Column INSENSITIVE CURSOR

for Select a.name,a.ColID,a.usertype,b.name,a.length,a.prec,a.scale,a.Status, a.cDefault,

case a.cdefault when 0 then ' ' else (select case c.text when "(' ')" then "('')" else c.text end

from syscomments c where a.cdefault = c.id) end const_key

from syscolumns a, systypes b where object_name(a.id) = @ObjName

and a.usertype = b.usertype order by a.ColID

set nocount on

Select @Script = 'Create table ' + @ObjName + '('

Insert into #spscript values(@Script,0)

/* Get column information */

open Cursor_Column

fetch next from Cursor_Column into @ColName,@ColID,@UserType,@TypeName,@Length,@Prec,@Scale,

@Status,@cDefault,@Const_Key

Select @Script = ''

while (@@FETCH_STATUS <> -1)

begin

if (@@FETCH_STATUS <> -2)

begin

Select @Script = @ColName + ' ' + @TypeName

if @UserType in (1,2,3,4)

Select @Script = @Script + '(' + Convert(char(3),@Length) + ') '

else if @UserType in (24)

Select @Script = @Script + '(' + Convert(char(3),@Prec) + ','

+ Convert(char(3),@Scale) + ') '

else

Select @Script = @Script + ' '

if ( @Status & 0x80 ) > 0

Select @Script = @Script + ' IDENTITY(1,1) '

if ( @Status & 0x08 ) > 0

Select @Script = @Script + ' NULL '

else

Select @Script = @Script + ' NOT NULL '

if @cDefault > 0

Select @Script = @Script + ' DEFAULT ' + @Const_Key

end

fetch next from Cursor_Column into @ColName,@ColID,@UserType,@TypeName,@Length,@Prec,@Scale,

@Status,@cDefault,@Const_Key

if @@FETCH_STATUS = 0

begin

Select @Script = @Script + ','

Insert into #spscript values(@Script,0)

end

else

begin

Insert into #spscript values(@Script,1)

Insert into #spscript values(')',0)

end

end

Close Cursor_Column

Deallocate Cursor_Column

/* Get index information */

Declare Cursor_Index INSENSITIVE CURSOR

for Select name,IndID,status,Segment from sysindexes where object_name(id)=@ObjName

and IndID > 0 and IndID<>255 order by IndID

Open Cursor_Index

Fetch Next from Cursor_Index into @ColName, @IndID, @IndStatus, @Segment

while (@@FETCH_STATUS <> -1)

begin

if @@FETCH_STATUS <> -2

begin

declare @i TinyInt

declare @thiskey varchar(50)

declare @IndDesc varchar(68) /* string to build up index desc in */

Select @i = 1

while (@i <= 16)

begin

select @thiskey = index_col(@ObjName, @IndID, @i)

if @thiskey is null

break

if @i = 1

select @Index_Key = index_col(@ObjName, @IndID, @i)

else

select @Index_Key = @Index_Key + ', ' + index_col(@ObjName, @IndID, @i)

select @i = @i + 1

end

if (@IndStatus & 0x02) > 0

Select @Script = 'Create unique '

else

Select @Script = 'Create '

if @IndID = 1

select @Script = @Script + ' clustered '

if (@IndStatus & 0x800) > 0

select @strPri_Key = ' PRIMARY KEY (' + @Index_Key + ')'

else

select @strPri_Key = ''

if @IndID > 1

select @Script = @Script + ' nonclustered '

Select @Script = @Script + ' index ' + @ColName + ' ON '+ @ObjName

+ '(' + @Index_Key + ')'

Select @IndDesc = ''

/*

** See if the index is ignore_dupkey (0x01).

*/

if @IndStatus & 0x01 = 0x01

Select @IndDesc = @IndDesc + ' IGNORE_DUP_KEY' + ','

/*

** See if the index is ignore_dup_row (0x04).

*/

if @IndStatus & 0x04 = 0x04

Select @IndDesc = @IndDesc + ' IGNORE_DUP_ROW' + ','

/*

** See if the index is allow_dup_row (0x40).

*/

if @IndStatus & 0x40 = 0x40

Select @IndDesc = @IndDesc + ' ALLOW_DUP_ROW' + ','

if @IndDesc <> ''

begin

Select @IndDesc = SubString( @IndDesc, 1, DataLength(@IndDesc) - 1 )

Select @Script = @Script + ' WITH ' + @IndDesc

end

/*

** Add the location of the data.

*/

if @Segment <> 1

select @Script = @Script + ' ON ' + name

from syssegments

where segment = @Segment

end

if (@strPri_Key = '')

Insert into #spscript values(@Script,0)

else

update #spscript set Script = Script + @strPri_Key where LastLine = 1

Fetch Next from Cursor_Index into @ColName, @IndID, @IndStatus, @Segment

end

Close Cursor_Index

Deallocate Cursor_Index

Select Script from #spscript order by id

set nocount off

return (0)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有