我想用以下代码做的是让它获取所有数据库名称,然后遍历这些数据库,检查表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。
答案 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
'