188

変更されるリンクサーバーがあります。一部のプロシージャは、次のようにリンクサーバーを呼び出します[10.10.100.50].dbo.SPROCEDURE_EXAMPLE。この種の作業を行うトリガーもあります。それを変更するために使用するすべての場所を見つける必要があります[10.10.100.50]

SQL Server Management Studio Expressでは、VisualStudioで「データベース全体を検索する」などの機能が見つかりませんでした。特別なsys-selectは、必要なものを見つけるのに役立ちますか?

4

14 に答える 14

337

これは、テキストを検索するためにシステムで使用する手順の一部です。

DECLARE @Search varchar(255)
SET @Search='[10.10.100.50]'

SELECT DISTINCT
    o.name AS Object_Name,o.type_desc
    FROM sys.sql_modules        m 
        INNER JOIN sys.objects  o ON m.object_id=o.object_id
    WHERE m.definition Like '%'+@Search+'%'
    ORDER BY 2,1
于 2009-03-23T19:24:53.477 に答える
22

次のように見つけることができます

SELECT DISTINCT OBJECT_NAME(id) FROM syscomments WHERE [text] LIKE '%User%'

ストアド プロシージャ内に「ユーザー」などのテキストを含む個別のストアド プロシージャ名が一覧表示されます。より詳しい情報

于 2010-11-19T05:31:50.720 に答える
18

[遅い回答ですが、うまくいけば役に立ちます]

システム テーブルを使用しても、常に 100% 正しい結果が得られるとは限りません。一部のストアド プロシージャやビューが暗号化されている可能性があるためです。その場合、必要なデータを取得するためにDAC接続を使用する必要があります。

暗号化されたオブジェクトを簡単に処理できるApexSQL Searchなどのサードパーティ ツールを使用することをお勧めします。

オブジェクトが暗号化されている場合、Syscomments システム テーブルはテキスト列に null 値を与えます。

于 2013-05-03T11:31:47.167 に答える
13
-- Declare the text we want to search for
DECLARE @Text nvarchar(4000);
SET @Text = 'employee';

-- Get the schema name, table name, and table type for:

-- Table names
SELECT
       TABLE_SCHEMA  AS 'Object Schema'
      ,TABLE_NAME    AS 'Object Name'
      ,TABLE_TYPE    AS 'Object Type'
      ,'Table Name'  AS 'TEXT Location'
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%'+@Text+'%'
UNION
 --Column names
SELECT
      TABLE_SCHEMA   AS 'Object Schema'
      ,COLUMN_NAME   AS 'Object Name'
      ,'COLUMN'      AS 'Object Type'
      ,'Column Name' AS 'TEXT Location'
FROM  INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%'+@Text+'%'
UNION
-- Function or procedure bodies
SELECT
      SPECIFIC_SCHEMA     AS 'Object Schema'
      ,ROUTINE_NAME       AS 'Object Name'
      ,ROUTINE_TYPE       AS 'Object Type'
      ,ROUTINE_DEFINITION AS 'TEXT Location'
FROM  INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%'+@Text+'%'
      AND (ROUTINE_TYPE = 'function' OR ROUTINE_TYPE = 'procedure');
于 2012-08-27T09:25:27.807 に答える
5

これはあなたのために働くでしょう:

use [ANALYTICS]  ---> put your DB name here
GO
SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_desc, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
where sm.definition like '%SEARCH_WORD_HERE%' collate SQL_Latin1_General_CP1_CI_AS
ORDER BY o.type;
GO
于 2012-04-26T08:51:42.413 に答える
4

リンク サーバーが変更されるたびに、ストアド プロシージャ、関数、およびビューのテキストを変更するよりもはるかに優れたソリューションがあります。以下にいくつかのオプションを示します。

  1. リンク サーバーを更新します。FinanceIP アドレスで名前が付けられたリンク サーバーを使用する代わりに、またはなどのリソースの名前で新しいリンク サーバーを作成しますDataLinkProd。次に、到達するサーバーを変更する必要がある場合は、リンク サーバーを更新して、新しいサーバーを指すようにします (または、リンク サーバーを削除して再作成します)。

  2. 残念ながら、リンク サーバーまたはスキーマのシノニムを作成することはできませんが、リンク サーバー上にあるオブジェクトのシノニムを作成することはできます。たとえば、プロシージャ[10.10.100.50].dbo.SPROCEDURE_EXAMPLEは別名で作成できます。おそらくスキーマを作成しdatalinkprod、次にCREATE SYNONYM datalinkprod.dbo_SPROCEDURE_EXAMPLE FOR [10.10.100.50].dbo.SPROCEDURE_EXAMPLE;. 次に、リンク サーバー名を受け入れるストアド プロシージャを作成します。このストアド プロシージャは、リモート データベースからすべての潜在的なオブジェクトを照会し、それらのシノニムを (再) 作成します。すべての SP と関数は、 で始まる同義語名を使用するために 1 回だけ書き換えられdatalinkprod、その後は、あるリンク サーバーから別のリンク サーバーに変更され、ほんの一瞬EXEC dbo.SwitchLinkedServer '[10.10.100.51]';で別のリンク サーバーを使用しています。

さらに多くのオプションがあるかもしれません。人間が作成したスクリプトを変更するのではなく、前処理、構成、または間接化の優れた手法を使用することを強くお勧めします。マシンが作成したスクリプトを自動的に更新することは問題ありません。これは前処理です。手動で物事を行うのはひどいことです。

于 2013-03-20T18:22:31.517 に答える
0

これを仕事に使っています。@TEXTフィールドの[]は省略しますが、すべてを返したいようです...

カウントをオンに設定

DECLARE @TEXT VARCHAR(250)
DECLARE @SQL VARCHAR(250)

SELECT @ TEXT = '10.10.100.50'

CREATE TABLE #results(db VARCHAR(64)、objectname VARCHAR(100)、xtype VARCHAR(10)、definition TEXT)

SELECT @TEXTas'検索文字列'
#databases CURSOR FOR SELECT NAME FROM master..sysdatabases wheredbid>4を宣言します
    DECLARE @c_dbname varchar(64)   
    OPEN #databases
    FETCH #databases INTO @c_dbname   
    WHILE @@ FETCH_STATUS -1
    始める
        SELECT @SQL ='INSERT INTO #results'
        SELECT @SQL = @SQL +'SELECT''' + @c_dbname +'''AS db、o.name、o.xtype、m.definition'   
        SELECT @SQL = @SQL +'FROM' + @ c_dbname+'。sys.sql_modulesm'   
        SELECT @SQL = @SQL +'INNER JOIN' + @ c_dbname +'.. sysobjects o ON m.object_id = o.id'   
        SELECT @SQL = @SQL +'WHERE [definition] LIKE''%' + @ TEXT +'%'''   
        EXEC(@SQL)
        FETCH #databases INTO @c_dbname
    終わり
    #databasesを閉じる
#databasesの割り当てを解除する

SELECT * FROM #results order by db、xtype、objectname
ドロップテーブル#results
于 2009-03-23T19:34:13.717 に答える
0

私は過去にこれらを使用しました:

この特定のケースでは、ストアドプロシージャ全体で特定の文字列を置き換える必要がある場合、最初のリンクの方がおそらくより適切です。

少し話題から外れたクイック検索アドインは、SQL ServerManagementStudioでオブジェクト名を検索する場合にも役立ちます。いくつかの改善を加えた修正バージョンが利用可能であり、他のいくつかの便利なアドインを備えた別の新しいバージョンもCodeplexで利用可能です。

于 2009-03-23T19:35:14.963 に答える