代码改变世界

SQl Server 建表SQL的脚本

2011-05-21 16:36  bingcaihuang  阅读(636)  评论(0编辑  收藏  举报
数据库里新建一个表的方式比较多,可以在对象资源管理器手动新建一个表,这样的建表方式比较方便、直观。但是如果该表要在几个数据库(测试系统、正式系统等)里新建的话,这时反而不如用脚本来处理方便得多。尤其是在创建数据库时要新建上百个表时,那种方式想都不敢想。这里主要讨论、收集使用脚本来新建表的写法。如有不妥或不对的地方,希望大家多多指教,更正我的错误。下面来看看第一种SQL写法
CREATE TABLE UserContactPerson
(
   ID            
INT PRIMARY KEY,
   UserID        
INT,
   ContactPersonID    
INT
    
)

(贴代码是格式错位了)这种写法是最原始、落后的。也是最容易产生错误的写法:首先它没有在代码里指定在那个数据库执行,有时候人很粗心,打开文件就执行了,有可能把表就建到master或其他数据库去了。其次在批处理建表的时候,如果这个表在该数据库已经存在了。则会影响执行。所以我们可以改善一下它的写法。


USE MyAssistant 
GO

IF  EXISTS (SELECT 1 FROM SYSOBJECTS WHERE NAME = 'UserContactPerson' AND XTYPE = 'U')

DROP TABLE UserContactPerson;
CREATE TABLE UserContactPerson
(
   ID            
INT PRIMARY KEY,
   UserID        
INT,
   ContactPersonID    
INT
    
)
GO

这种写法也有个问题,就是DROP TABLE UserContactPerson; 这个地方,一般来说不建议删除表后,然后新建,除非是数据库创建时,新建表。原因不用多说,想必大家都很明白。一般应该给予提示,让执行这段脚本的人去选择处理,类似于下面的写法


IF NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'Users' AND XTYPE ='U'

CREATE TABLE [Users]
(
    
[UserID]            INT IDENTITY(1,1),        --ID主键
    [UserName]            NCHAR(15),                --用户名
    [Password]            CHAR(15),                --密码
    [NickName]            NCHAR(15),                --别名、网名    
    [Name]                NCHAR(8),                --真实姓名
    [SEX]                BIT,                    --性别
    [Age]                SMALLINT,                --年龄
    [Birthday]            SMALLDATETIME,            --生日
    [Moblie]            CHAR(11),                --手机
    [OfficePhone]        CHAR(12),                --办公室座机
    [HomePhone]            CHAR(12),                --家里座机
    [Email]                NCHAR(30),                --电子邮件
    [QQ]                CHAR(10),                --QQ
    [MSN]                CHAR(20),                --MSN
    [Skype]                CHAR(25),                --Skype
    [PersonWebsit]        CHAR(20),                --个人主页
    [Schoole]            NCHAR(20),                --毕业学校
    [Place]                NCHAR(15),                --籍贯
    [Hometown]            NCHAR(25),                --家乡
    [CreateDate]        SMALLDATETIME,            --用户创建时间
    [UpdateDate]        SMALLDATETIME,            --用户资料更新时间
    [LastLogin]            SMALLDATETIME,            --用户最后登录时间
    [IP]                CHAR(15),                --用户登录IP
    [Lock]                BIT,                    --用户是否被锁定
    [IsAdmin]            BIT,                    --是否是管理员
    [Session]            CHAR(20),                --保存登录Seesion
    CONSTRAINT PK_Users_UserID PRIMARY KEY(UserID)    
)
ELSE
  
--DROP TABLE Users
  PRINT 'this table have been existed! you should check and take action'
GO

下面看看来判断该表是否存在的几种方法


1: IF NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = 'Users' AND XTYPE ='U'

2IF EXISTS ( SELECT 1 FROM dbo.sysobjects  WHERE id = object_id(N'[dbo].[UserGroup]'and OBJECTPROPERTY(id, N'IsTable'= 1)

3IF OBJECT_ID(N'ContactPerson'IS NOT NULL

转自:http://www.th7.cn/Article/sj/ms/200908/364039.html