2011-10-25 134 views
0

我有一個基於多個庫的軟件套件,其中:SQL Server多步驟存儲過程

1 library = 1 SQL數據庫。

不同的用戶可以對不同的庫有不同的訪問權限。

此外,數據庫以特定方式命名以幫助識別哪些是「我的」,哪些不是。

我想創建一個存儲過程,需要一個叫@UserName變量,並返回一個名字開始MYDB,其中@UserName在一個表中USERS發現的數據庫。

我想我會從EXEC sp_databases開始,但我不確定如何繼續。

我需要知道的是:

  1. 如何迭代sp_databases結果拉出來只是有一個名稱匹配我的模式的數據庫?
  2. 我怎麼那麼在USERS表中的每個數據庫的[USER NAME]列檢查@UserName從1號回來了?

我猜它與臨時表和遊標有關,但我不確定從哪裏開始。

任何幫助?

謝謝!

回答

2

下面是一些概念驗證碼,向您展示了一種方法。 sys.databases包含一個更易訪問的數據庫列表。儘管如此,你幾乎不得不使用動態sql。

CREATE PROCEDURE MyDBs @userName VARCHAR(255) 
AS 
BEGIN 

DECLARE @max INT 
DECLARE @i INT 
DECLARE @sql VARCHAR(500) 

CREATE TABLE #SQL 
(
    rid int identity primary key clustered, 
    query varchar(500) 
) 

INSERT INTO #SQL(query) 
SELECT 'SELECT * FROM ['+ name '+].USERS WHERE username = @UserName' 
FROM master.sys.databases 
WHERE NAME LIKE '%yourpattern%' 

SELECT @max = @@rowcount, @i = 1 

WHILE @i <= @max 
BEGIN 
    SELECT @sql = query FROM #sql WHERE rid = @i 
    EXEC @sql 
    SET @i = @i + 1 
END 

DROP TABLE #SQL 
+0

我結束了這一個稍微修改後的版本,但你絕對讓我走上正軌!謝謝! – mbm29414

1

爲1,只看sp_databases代碼,複製並修改您的需求。例如(請參閱where子句這是存儲過程的sp_databases的實際代碼的最後2個條件你可以看一下它的主人分貝。):

declare @UserName varchar(50)='someuser' 
select 
     DATABASE_NAME = db_name(s_mf.database_id), 
     DATABASE_SIZE = convert(int, 
            case -- more than 2TB(maxint) worth of pages (by 8K each) can not fit an int... 
            when convert(bigint, sum(s_mf.size)) >= 268435456 
            then null 
            else sum(s_mf.size)*8 -- Convert from 8192 byte pages to Kb 
            end), 
     REMARKS   = convert(varchar(254),null) 
    from 
     sys.master_files s_mf 
    where 
     s_mf.state = 0 and -- ONLINE 
     has_dbaccess(db_name(s_mf.database_id)) = 1 and 
     --db_name(s_mf.database_id) like '%'[email protected]+'%' and exists -- you may or may not want to leave this condition here. You'll figure out what condition to use 
     (select 1 from databasename.dbo.Users where [UserName][email protected]) 
    group by s_mf.database_id 
    order by 1