私は接続されているSQLサーバーにデータベースの束があります。「myStoredProcedure」という名前のストアドプロシージャはどのデータベースにあるのですか?
「myStoredProcedure」という名前のストアドプロシージャがどのデータベースに存在するかを調べるには、どのようにsysobjectsをクエリする必要がありますか?
クエリはデータベース名を返す必要があります。
おかげ
私は接続されているSQLサーバーにデータベースの束があります。「myStoredProcedure」という名前のストアドプロシージャはどのデータベースにあるのですか?
「myStoredProcedure」という名前のストアドプロシージャがどのデータベースに存在するかを調べるには、どのようにsysobjectsをクエリする必要がありますか?
クエリはデータベース名を返す必要があります。
おかげ
は、私はあなたがこのために求めていないけど、私は本当にSSMSのためRedGate's Sql Searchアドインをダウンロードし、それを使用すると思います。これは、任意のデータベース上の任意のオブジェクト(proc、テーブル、ビュー、列など)を簡単に見つけることができます。
それは無料です!
+1素晴らしいおすすめ! Seconded。 –
私はこれを試してみるだろう。その後、削除する前に結果ウィンドウに内容を出力し、手順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を持っているデータベース(または複数のデータベースがあるかもしれません)を知る必要がある場合は、これが必要です。出力をパラメータとして他の場所で使用したい場合は、少し時間がかかることがあります。
ところで、私はこの数か月のうちに自分自身でこのことを学んでいるので、誰かが上記のことを批判してより良い方法を提案すれば、私はフィードバックを受けてうれしいです。同様に、私はここに投稿された質問を私の能力のうち最も良いものに答えることができます。
乾杯
だから好奇心から、私は、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
これは、オーバーキル+が互換性ビューを使用する方法です。 -1それは投票に値するものではないので、-1 – gbn
http://stackoverflow.com/questions/219434/query-that-returns-list-of-all-stored-procedures-in-an-ms-sql-database多分あなたはこれを変更することができますデータベース間でやり取りする – johnny
しかし、私はデータベース名の後ろにある – pencilCake
良い質問です、なぜこれを行う必要があるのですか?私はsysテーブルでこのデータを見つけることに行きましたが、すべてのデータベースをそのプロシージャにリンクする方法を見つけることはできません。 – Purplegoldfish