2011-12-22 6 views
2

私は接続されているSQLサーバーにデータベースの束があります。「myStoredProcedure」という名前のストアドプロシージャはどのデータベースにあるのですか?

「myStoredProcedure」という名前のストアドプロシージャがどのデータベースに存在するかを調べるには、どのようにsysobjectsをクエリする必要がありますか?

クエリはデータベース名を返す必要があります。

おかげ

+0

http://stackoverflow.com/questions/219434/query-that-returns-list-of-all-stored-procedures-in-an-ms-sql-database多分あなたはこれを変更することができますデータベース間でやり取りする – johnny

+0

しかし、私はデータベース名の後ろにある – pencilCake

+0

良い質問です、なぜこれを行う必要があるのですか?私はsysテーブルでこのデータを見つけることに行きましたが、すべてのデータベースをそのプロシージャにリンクする方法を見つけることはできません。 – Purplegoldfish

答えて

3

は、私はあなたがこのために求めていないけど、私は本当にSSMSのためRedGate's Sql Searchアドインをダウンロードし、それを使用すると思います。これは、任意のデータベース上の任意のオブジェクト(proc、テーブル、ビュー、列など)を簡単に見つけることができます。

それは無料です!

+0

+1素晴らしいおすすめ! Seconded。 –

0

私はこれを試してみるだろう。その後、削除する前に結果ウィンドウに内容を出力し、手順SP_MSForEachDb保存された文書化されていない/サポートされていないシステムを使用して、グローバルな一時テーブルに任意のヒット曲を書いています

CREATE TABLE ##DatabaseList 
       (
       DatabaseName varchar(50) 
       ) 

EXECUTE SP_MSForEachDB 'USE [?]; INSERT INTO ##DatabaseList SELECT DB_NAME() FROM [sys].[objects] WHERE name = "MyStoredProcedure" AND type_desc = "SQL_STORED_PROCEDURE"' 

SELECT * FROM ##DatabaseList 

DROP TABLE ##DatabaseList 

表。適切な名前のSPを持っているデータベース(または複数のデータベースがあるかもしれません)を知る必要がある場合は、これが必要です。出力をパラメータとして他の場所で使用したい場合は、少し時間がかかることがあります。

ところで、私はこの数か月のうちに自分自身でこのことを学んでいるので、誰かが上記のことを批判してより良い方法を提案すれば、私はフィードバックを受けてうれしいです。同様に、私はここに投稿された質問を私の能力のうち最も良いものに答えることができます。

乾杯

0

だから好奇心から、私は、ADGは、彼のソリューションがサポートされていない、文書化されていない手順を使用していた言及し、特に以来、これを自分で書くしようとすることを決めました。これは、2番目のパラメータを取るように拡張することもできるので、タイプ= P(格納されたProc)をチェックして、おそらくそれを変更してビュー/テーブルなどの他のものを探すことができます。

私の解決策は少し長いですが、行く:

CREATE PROCEDURE spFindProceduresInDatabases 
(
    @ProcedureName NVARCHAR(99) 
) 
AS 
BEGIN 

    -- Get all the database names and put them into a table 
    DECLARE @Db TABLE (DatabaseName Varchar(99)) 
    INSERT INTO @Db SELECT name FROM Sys.databases 

    -- Declare a table to hold our results 
    DECLARE @results TABLE (DatabaseName VARCHAR(99)) 

    -- Make a Loop 

    -- Declare a variable to be incremented 
    DECLARE @count INT 
    SET @count = 0 

    -- Declare the end condition 
    DECLARE @endCount INT 
    SELECT @endCount = COUNT(*) FROM @Db 

    -- Loop through the databases 
    WHILE (@count < @endCount) 
    BEGIN 
     -- Get the database we are going to look into 
     DECLARE @dbWeAreChecking VARCHAR(99) 
     SELECT TOP 1 @dbWeAreChecking = DatabaseName FROM @Db 
     DELETE FROM @Db WHERE DatabaseName = @dbWeAreChecking 

     -- Create and execute our query 
     DECLARE @Query NVARCHAR(3000) 
     SET @Query = N'SELECT @outParam = COUNT(*) FROM '[email protected]+'.sys.sysobjects WHERE type = ''P'' and name = @ProcedureName' 

     Declare @outParam INT 
     print (@Query) 
     DECLARE @ParmDefinition NVARCHAR(500) 
     DECLARE @IntVariable INT 
     SET @ParmDefinition = N'@ProcedureName VARCHAR(99),@outParam INT OUTPUT' 

     SET @IntVariable = 35 
     EXECUTE sp_executesql 
       @Query , 
       @ParmDefinition, 
       @ProcedureName, 
       @outParam = @outParam OUTPUT 

     -- If we have a result insert it into the results table 
     If (@outParam > 0) 
     BEGIN 
      INSERT INTO @results(DatabaseName) VALUES(@dbWeAreChecking) 
     END 

     -- Increment the counter 
     SET @count = (@count + 1) 
    END 

    -- SELECT ALL OF THE THINGS!!! 
    SELECT * FROM @results 

END 
+0

これは、オーバーキル+が互換性ビューを使用する方法です。 -1それは投票に値するものではないので、-1 – gbn

関連する問題