在程序中,有时候可能需要动态创建数据库表,但在创建之前需要先判断这个表是否存在。
1. 方法一,用如下的一个sql语句搞定:
SELECT count(*) as tbexist FROM sys.tables WHERE name = 'TableName'
不管要检测的表 TableName 是否存在,这条语句都会有一条记录出现,而且只有一列,列名为 tbexist。如果表 TableName 存在,则这条记录的值就是1,否则就是0
以上就是我自己检测已经创建的一个表,结果显示为1.
2. 方法二,如果sql语句改成如下的样子:
SELECT * FROM sys.tables WHERE name = 'TableName'
则如果指定的表TableName存在,就会有一条记录,如下所示:
如果表不存在,则记录为空:
这两种方法都可以,本质上一样的
3. 如果表不存在,则创建它
如下为一个示例:
declare @tabName as VARCHAR(32);
set @tabName = 'tb2';IF (SELECT count(*) as tbexist FROM sys.tables WHERE name = @tabName) = 1
BEGIN
print 'this is ok';
RETURN;
END
ELSE
BEGIN
print 'this is NOT exist, now will create the table ' + @tabName;
END/*这里不能直接把表名传递到CREATE TABLE命令中,只能采用字符串的方式,通过sp_executesql存储过程来执行*/
declare @sqlstring as NVARCHAR(1024);
SET @sqlstring = 'CREATE TABLE [dbo].[' + @tabName + ']( \
[ID] [int] IDENTITY(1,1) NOT NULL, \
[type] [smallint] NOT NULL, \
[valstr] [nvarchar](512) NOT NULL, \
[valnum] [int] NOT NULL, \
[tdesc] [nvarchar](512) NOT NULL, \
[timein] [datetime] NOT NULL \
) ON [PRIMARY]';EXEC sp_executesql @sqlstring;
以上示例判断如果表tb2不存在,就进行创建,且打印一条信息:this is NOT exist, now will create the table tb2,否则直接返回,在返回之前打印:this is ok
需要注意的是,在后面创建表的时候,不能像下面这样:
CREATE TABLE [dbo].[@tabName](
[ID] [int] IDENTITY(1,1) NOT NULL,
[type] [smallint] NOT NULL,
[valstr] [nvarchar](512) NOT NULL,
[valnum] [int] NOT NULL,
[tdesc] [nvarchar](512) NOT NULL,
[timein] [datetime] NOT NULL
) ON [PRIMARY]
而是要把这个创建表的语句放到字符串中,然后通过存储过程来执行它,否则创建出来的表名就是 @tabName,也就是这个变量无法被直接传递给CREATE TABLE命令