2011-06-03 22 views
4

我試圖用下面的代碼做的是有它抓住所有的數據庫名稱,然後遍歷這些數據庫檢查,看看錶tblAdminLogin存在,如果它不更新的用戶名「富」如何在OBJECT_ID中使用T-SQL變量來檢查表是否存在?

我的密碼一直使用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 [email protected] 
    if OBJECT_ID(''[email protected]+'.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 [email protected] 
    if OBJECT_ID(''[email protected]+'.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 

編輯:新增T-SQL來冠軍,因爲我使用SQL Server

編輯:修正了錯字.dbl。到正確的.dbo。

+0

我知道你選擇的答案,但要做到這一點,最好的辦法是明確使用'sp_msforeachdb'。當api提供一種方式時,使用它總是一個好主意。查看顯示如何使用'sp_msforeachdb'的答案 – Hogan 2011-06-04 13:47:15

回答

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 [email protected] 
    if OBJECT_ID(''[email protected]+'.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 [email protected] 
    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 
+0

您確定在一個或多個數據庫中有 .dbl.tblAdminLogin嗎?我沒有SQL Server的方便,看起來應該工作,所以我阻礙了爲什麼對object_id的調用不起作用。 – 2011-06-03 23:43:38

+0

@Shannon我修復了我的錯字.dbl。到.dbo。和OBJECT_ID Portion Worked,但set @SQL部分返回錯誤「The name'update [dbname] .dbo.tblAdminLogin Set password ='bar'其中username ='foo''不是有效的標識符。 – 2011-06-03 23:51:04

+0

@Shannon是的,它在40左右的數據庫。順便說一句,感謝sysname – 2011-06-03 23:54:03

1

備選:

EXEC sp_MSForEachDB 
    'Use [?]; if object_id(''tblAdminLogin'') is not null Select password from tblAdminLogin where username = ''foo''' 
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 
' 
相關問題