存储过程中,在判断表是否存在(100分)

  • 主题发起人 主题发起人 赛特
  • 开始时间 开始时间

赛特

Unregistered / Unconfirmed
GUEST, unregistred user!
存储过程中,在判断表是否存在时是这样的撒:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test]
问题是:需要判断的表test还不存在,是用户使用时动态建立的,但存储过程该怎么写呢?
我这样试过,但不行:
set @sqlstr='select '+''''+@count+''''+'=count(*) from dbo.sysobjects where id=object_id(N'+''''+'[dbo].['+@table+']'+''''+') and OBJECTPROPERTY(id, N'+''''+'IsUserTable'+''''+') = 1'
exec sp_executesql @str
if @count>0
--说明存在
else
--说明不存在
假如存在了,又该怎么删除呢?
 
SQL 2000中的表是分两个地方保存的,即永久表的表名是用你上面的语句是可以查到的,但是如果是临时表(我不知道你创建的是不是动态的临时表),用上面的语句是不行的,用在TEMPDB这个数据库中查询,而不是MASTER数据库中,所以你再看看
 
不是临时表,就是一般的表,只不过是用户在使用中创建的。程序开发时还不存在,所以就不知道该怎么写存储过程了。我就是要用存储过程来控制创建或删除这些表。
 
在存储过程动态建表不就行了。
 
就是啊,创建之前你总要判断是否同名的表已经存在,如果存在了要删除再创建吧.这个过程该怎么写?最重要的是,表名还不确定哟,要通过参数传递
 
如果是不需要保存的表,还是建临时表比如好,首先在创建时判断表是否存在,不存在的话,就可以用这个表名,用好之后,马上删除.这样就不存在问题了,即使对于一些由于异常没有被及时删除的表,由于临时表的特征,在SQL服务器重启后就不存在了,所以下次使用时,还是不存在这些表的
如果一定要用永久表,那么对表的命名采用比较固定的格式,比如说AAA1,AAA2,AAA3,程序中就可以将此类的表名全部删除即可,或者可以做一个自动执行的存储过程处理删除的动作(在启动时删除一次即可)
 
是需要保存的表!命名肯定规定好了,但在调用存储过程时需要用参数传递的方式,就是这里不知道该怎么写存储过程了!你能写来看看吗?两步:1、判断是否已经存在;2、如果存在就删除再重新创建;如果不存在则直接创建。
我知道判断的方式是这样的:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test]
但上面的语句test是固定的,我需要的是参数传递的方式。因为表名还不确定,但执行是肯定是知道要创建的表名的。
 
对了,如果你一定要说,你的表名就可什么规律都没有的,那么你还可以在系统安装的时候,做一个表,记录程序中用到的全部用户表,然后每次删除时,取得当前数据库的全部用户表名,把没有注册过的表全部删除掉即可
 
那我就不明白了,既然是需要保存的表,为什么又要删除?
 
是需要保存的表!命名肯定规定好了,但在调用存储过程时需要用参数传递的方式,就是这里不知道该怎么写存储过程了!你能写来看看吗?两步:1、判断是否已经存在;2、如果存在就删除再重新创建;如果不存在则直接创建。
我知道判断的方式是这样的:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test]
但上面的语句test是固定的,我需要的是参数传递的方式。因为表名还不确定,但调用存储过程时肯定是知道要处理的表的名字的。比如,调用同一的存储过程,这次我需要的是判断table1这张表,下次我需要判断table2这张表。存储过程该怎么写嘛?
 
哦,原来是这个意思哦,那这样就成了,假设传递的表名是@tbName
if exists (select count(*) from dbo.sysobjects where id = object_id(@tbName) and xtype='U')
exec('drop table '+@tbName)
就可以了,不过我在外面,没有SQL数据库,忘记了记录表类型的字段是不是xtype,你到dbo.sysobjects中看一下就知道了
 
能说得再具体点吗?我才接触sql server,这方面不熟悉。
@tbName是什么类型呀?
object_id(@tbName)这么写对吗?不是object_id(N'[dbo].[test]')这样吗?
 
CREATE PROCEDURE DelTable
@TableName varchar(50)
AS
if exists (select name from dbo.SysObjects where name=@tableName and xType='U')
exec('drop table '+@TableName)

return
GO
 
如果表名没有中文字符,那么申明成varchar就可以了,如果有,可以申明成nvarchar,问题都不大的,dbo加不加无所谓的
 
好的,我试试
 
我看SysObjects这张表还有个字段叫Type,它和xType有什么区别呢?
建表就这样对不对哟:(表名也不确定,需要参数传递方式。表结构是定了的)
CREATE TABLE @mytable
(emp_id SMALLINT PRIMARY KEY ,
...........
)
 
select一下,看看表存不存在就行了!
 
type与XTYPE的区别你可以看SQL的帮助,当中对这个表的每字段的含义都有详细解释
CREATE TABEL语句直接加变量名也是不行的,要构建成字符串,再用exec执行,或者用exec sp_executesql 执行,后一个是可以带参数的
 
to levi:
set @sqlstr='create table'+@table+'(emp_id SMALLINT PRIMARY KEY ,...)'
exec sp_executesql @sqlstr
那这样为什么不行呢?错在哪里哟?

但写成这样就对了:exec('create table '+@tablename+'(bh varchar(10) primary key)')
为什么呢?
 
@table是变量,在SQL中用execute()执行带变量的sql语句
 
后退
顶部