如何在if OBJECT_ID中使用T-SQL变量来检查表是否存在?

时间:2011-06-03 22:53:25

标签: sql-server exists

我想用以下代码做的是让它获取所有数据库名称,然后遍历这些数据库,检查表tblAdminLogin是否存在以及是否确实更新了用户名'foo'的密码

我一直在使用select语句而不是更新,直到它正常工作。

declare @databases table
(
    PK      int IDENTITY(1,1), 
    dbid    int,
    name    varchar(50)
)

insert into @databases(dbid, name) select dbid, name from master.dbo.sysdatabases

Declare @maxPK int; select @maxPK = MAX(PK) from @databases
Declare @pk int; Set @pk = 1
Declare @name varchar(50)

While @pk <= @maxPK
Begin
    Select @name = name from @databases where PK=@pk
    if OBJECT_ID(''+@name+'.dbo.tblAdminLogin') IS NOT NULL
    Begin
        Select password from @name.dbo.tblAdminLogin where username = 'foo'
        --Update @name.dbo.tblAdminLogin Set password='bar' where username = 'foo' 
    End
    Set @pk = @pk + 1
End

有问题的主要代码是

    Select @name = name from @databases where PK=@pk
    if OBJECT_ID(''+@name+'.dbo.tblAdminLogin') IS NOT NULL
    Begin
        Select password from @name.dbo.tblAdminLogin where username = 'foo'
        --Update @name.dbo.tblAdminLogin Set password='bar' where username = 'foo' 
    End

编辑:因为我使用的是SQL Server,所以在标题中添加了T-SQL

编辑:修正了Typo .dbl。到了正确的.dbo。

3 个答案:

答案 0 :(得分:1)

动态SQL。

未测试

declare @SQL varchar(max) -- varchar(8000) if on SQL Server 2000 or earlier
While @pk <= @maxPK  
Begin      
    Select @name = name from @databases where PK=@pk
    if OBJECT_ID(''+@name+'.dbo.tblAdminLogin') IS NOT NULL      
    Begin          
        set @SQL = 'update ' + quotename(@name) + '.dbo.tblAdminLogin Set     password=''bar'' where username = ''foo'''
        exec (@SQL)
    End
    set @PK = @PK + 1
End

参考文献:

编辑:关于类型的一般说明,OP不要求:

数据库名称是SYSNAME类型,我最后检查过,它与NVARCHAR(128)相同。将该值存储在VARCHAR类型中可能会丢失信息。由于他们会选择的名字,某些网站的机会很小,但也有机会。

declare @databases table
(
    PK      int IDENTITY(1,1), 
    dbid    int,
    name    sysname
)

insert into @databases(dbid, name) select dbid, name from master.dbo.sysdatabases

Declare @maxPK int; select @maxPK = MAX(PK) from @databases
Declare @pk int; Set @pk = 1
Declare @name sysname -- so that 

declare @SQL nvarchar(4000) 
While @pk <= @maxPK  

Begin      
    Select @name = name from @databases where PK=@pk
    if OBJECT_ID(@name+N'.dbo.tblAdminLogin') IS NOT NULL      
    Begin          
        set @SQL = N'update ' + quotename(@name) + N'.dbo.tblAdminLogin Set     password=''bar'' where username = ''foo'''
        exec (@SQL)
    End
    set @PK = @PK + 1
End

答案 1 :(得分:1)

替代:

EXEC sp_MSForEachDB 
  'Use [?]; if object_id(''tblAdminLogin'') is not null Select password from tblAdminLogin where username = ''foo'''

答案 2 :(得分:1)

我可能会这样做:

exec sp_msforeachdb '
if (object_id(''[?].[dbo].[tblAdminLogin]'', ''U'')) is not null
begin
  update table [?].[dbo].[tblAdminLogin] Set password=''bar'' where username = ''foo''
  select ''?'', username, password from [?].[dbo].[tblAdminLogin] where username = ''foo''
end
'