What I am trying to do with the following code is have it grab all the database names then loop through those databases check to see if the table tblAdminLogin
exists and if it does update the password for username 'foo'
I have been using a select statement instead of an update as of yet until it works properly.
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
The main code in question is
Select @name = name from @databases where PK=@pk
if OBJECT_ID(''+@name+'.dbo.tblAdminLogin') IS NOT NULL
Begin
Select password from @name.dbo.tblAdminLogin wh开发者_高级运维ere username = 'foo'
--Update @name.dbo.tblAdminLogin Set password='bar' where username = 'foo'
End
Edit: Added T-SQL to title since I am using SQL Server
Edit: Fixed the Typo .dbl. to the correct .dbo.
Dynamic SQL.
Untested
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
References:
- QUOTENAME
- EXECUTE
Edit: general note on types, not asked for by OP:
The database name is of type SYSNAME which, last I checked, is equivelent to a NVARCHAR(128). Storing that value in a VARCHAR type has the chance of losing information. Small chance at some site because of the names they would choose, but a chance none the less.
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
Alternative:
EXEC sp_MSForEachDB
'Use [?]; if object_id(''tblAdminLogin'') is not null Select password from tblAdminLogin where username = ''foo'''
I might do something like this:
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
'
精彩评论