2

接続している SQL サーバーには多数のデータベースがあります。

'myStoredProcedure' という名前のストアド プロシージャが配置されているデータベースを見つけるには、sysobjects をどのようにクエリすればよいですか?

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

ありがとう

4

3 に答える 3

3

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

そしてそれは無料です!

于 2011-12-22T15:08:08.240 に答える
0

それで、好奇心から、特にADGが彼の解決策がサポートされていない、文書化されていない手順を使用していると述べたので、私はこれを自分で書いてみることにしました。これを拡張して2番目のパラメーターを取得することもできるため、type = P(ストアドプロシージャ)をチェックする場合は、ビュー/テーブルなどの他のものを探すように変更できます。

私の解決策は少し長いですが、ここに行きます:

  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 '+@dbWeAreChecking+'.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
于 2011-12-22T16:14:27.687 に答える
0

私はこれを試してみます:

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_MSForEachDbを使用し、ヒットをグローバル一時テーブルに書き込んでから、テーブルを削除する前に結果ウィンドウに内容を出力します。どのデータベース(またはデータベース-もちろん複数ある場合もあります)に適切な名前のSPがあるかどうかを知る必要がある場合は、これで十分です。他の場所で出力をパラメーターとして使用する場合は、もう少し作業が必要になる場合があります。

ちなみに、私はこの数か月間だけ自分でこのことを学んでいるので、誰かが上記を批評し、それを行うためのより良い方法を提案できるなら、私はフィードバックを受け取ってうれしいです。同様に、私はここに投稿されたさらなる質問に可能な限り答えることができます。

乾杯

于 2011-12-22T15:30:10.073 に答える