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

标签 sql-server exists

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

到目前为止,我一直在使用 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

编辑:修复了拼写错误.dbl。到正确的.dbo。

最佳答案

动态 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

关于sql-server - 如何在 if OBJECT_ID 中使用 T-SQL 变量来检查表是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6233416/

相关文章:

sql - 如何修复 “Only one expression can be specified in the select list when the subquery is not introduced with EXISTS” 错误?

ruby-on-rails - 如果存在如何拒绝?对于非嵌套属性?

asp.net - ASP.NET Web 应用程序的 SQL Server 身份验证

sql-server - 展平/合并重叠的时间间隔

c# - Dapper 和用户定义的数据库类型

Java Path Files.copy 重命名(如果存在)

python - 如何使用 Python 检查基本名称(仅名称的一部分)文件是否存在?

mysql - 过滤器和条件

SQL Server : multi-join with tuple IN clause

sql - 如果不存在则插入,如果存在则删除