2013-10-09 5 views
6

を作成せずに、これは私がこれまでに100個の以上の行を持つすべてのテーブルを見つけるために持っているものです。すべてのデータベーステーブルで特定の行データを検索しますか?プロシージャまたは表

SELECT sc.name +'.'+ ta.name TableName 
,SUM(pa.rows) RowCnt 
FROM sys.tables ta 
INNER JOIN sys.partitions pa 
ON pa.OBJECT_ID = ta.OBJECT_ID 
INNER JOIN sys.schemas sc 
ON ta.schema_id = sc.schema_id 
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0) AND pa.rows >100 
GROUP BY sc.name,ta.name,pa.rows 
ORDER BY TABLENAME 

は、私は特定の行データを見つけるためにデータベースを介して行くことができると同様のものがありますテーブル内の列のために?例えば

: 私はただ、特定の下で任意の特定のデータを探していPROCEDURE権限を作成したり、TABLE

のCREATE必要はありません。c.name =ギターとGUTARSは= 'フェンダー'

編集 多くの行を返すかどうかは関係ありません。

+2

このクエリは、分割されたテーブルに対して複数の行を返す可能性があります。 –

答えて

1

私はすべてを検索するためのスクリプトを提供How do I find a value anywhere in a SQL Server Database?に私の答えをご覧ください。データベース内のテーブル

この擬似コードの記述は、それはまた、あなたが例えば標準like構文を使用して、特定の列名を検索することができますselect * from * where any like 'foo'

ことだろう%guitar%を使用して、「ギター」という単語が含まれている列名を検索します。

これはアドホックなので、ストアドプロシージャを作成する必要はありませんが、information_schemaにアクセスする必要があります。

私はこのスクリプトをSQL 2000で使用しています。

+0

私はそれを実行しようとしましたが、キャンセルする必要があったので1分以上かかりました。私はこれが動作すると確信していますが、あまりにもサーバーを減速させずに私のための実用的な使用されていないようです。 ありがとうございます! – Sewder

+2

[多くのギター](http://www.imdb.com/title/tt0084503/quotes?item=qt0239707)が必要です。 –

2

私のソリューションがあなたに役立つかどうかはわかりません。しかし、その代わりに、以下のクエリを使用してギターを持つすべてのテーブルを任意の組み合わせで取得します。

Select t.name, c.name from sys.columns c inner join sys.tables t on c.object_id=t.object_id Where c.name like '%guitar%'

それはテーブルやギターの列の使用なしに応じて、20〜25個のテーブルを与えるだろうと仮定します。結果セットを見ることができ、使用可能なテーブルをほとんど知ることができます。 推測されたアイテムリストのFenderを検索します。

私はerpアプリケーションのメンテナンスに取り組んでおり、6000+テーブルと13000+プロシージャを持っていると言います。だから私は関連するテーブルを見つける必要があるときは、私はちょうど同じトリックを使用し、それは動作します。

+0

これは私がやってきたことです。ちょうど私のためにそれを自動的に行うことを望んでいました。私はこのようにいくつかの重要な列を見つけました! – Sewder

2

これは、SQL Serverデータベーステーブル内のすべての データを検索できる単純なストアドプロシージャです。また、テーブル名が カンマ区切りの値で指定されている場合、選択されたテーブルで を検索する機能があります。これには、SQLを実行せずにSQL だけを生成する機能があります。それのスクリプト版を同封する も。

パラメータと使用方法:

@Tablenames - カンマ区切りで単一のテーブル名または複数のテーブル名 を提供します。

空白のままにすると、それはデータベース

@SearchStr内のすべてのテーブルをチェックします - 検索文字列を提供します。 '%'を使用して 検索をコインにします。

EX:X%--- --- X

%のXで始まるデータを与える--- Xで終わるデータを

%のX%を与えるX

を含むデータを与えます

@ GenerateSQLOnly - データベースを検索せずにSQL ステートメントのみを生成する場合は1を指定します。

デフォルトでは0で、検索されます。私が仕事で使う

SornaクマールMuthurajことで
IF OBJECT_ID('SP_SearchTables','P') IS NOT NULL 
     DROP PROCEDURE SP_SearchTables 
    GO 
    CREATE PROCEDURE SP_SearchTables 
@Tablenames VARCHAR(500) 
,@SearchStr NVARCHAR(60) 
,@GenerateSQLOnly Bit = 0 
AS 


    SET NOCOUNT ON 

    DECLARE @MatchFound BIT 

    SELECT @MatchFound = 0 

    DECLARE @CheckTableNames Table 
    ( 
    Tablename sysname 
    ) 

    DECLARE @SQLTbl TABLE 
    ( 
    Tablename  SYSNAME 
    ,WHEREClause VARCHAR(MAX) 
    ,SQLStatement VARCHAR(MAX) 
    ,Execstatus  BIT 
    ) 

    DECLARE @sql VARCHAR(MAX) 
    DECLARE @tmpTblname sysname 
    DECLARE @ErrMsg VARCHAR(100) 

    IF LTRIM(RTRIM(@Tablenames)) IN ('' ,'%') 
    BEGIN 

     INSERT INTO @CheckTableNames 
     SELECT Name 
      FROM sys.tables 
    END 
    ELSE 
    BEGIN 

     SELECT @sql = 'SELECT ''' + REPLACE(@Tablenames,',',''' UNION SELECT ''') + '''' 

     INSERT INTO @CheckTableNames 
     EXEC(@sql) 

    END 

    IF NOT EXISTS(SELECT 1 FROM @CheckTableNames) 
    BEGIN 

     SELECT @ErrMsg = 'No tables are found in this database ' + DB_NAME() + ' for the specified filter' 
     PRINT @ErrMsg 
     RETURN 

    END 

    INSERT INTO @SQLTbl 
    (Tablename,WHEREClause) 
    SELECT QUOTENAME(SCh.name) + '.' + QUOTENAME(ST.NAME), 
      ( 
       SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10) 
        FROM SYS.columns SC 
        JOIN SYS.types STy 
        ON STy.system_type_id = SC.system_type_id 
        AND STy.user_type_id =SC.user_type_id 
       WHERE STY.name in ('varchar','char','nvarchar','nchar') 
        AND SC.object_id = ST.object_id 
       ORDER BY SC.name 
       FOR XML PATH('') 
      ) 
     FROM SYS.tables ST 
     JOIN @CheckTableNames chktbls 
       ON chktbls.Tablename = ST.name 
     JOIN SYS.schemas SCh 
     ON ST.schema_id = SCh.schema_id 
    WHERE ST.name <> 'SearchTMP' 
     GROUP BY ST.object_id, QUOTENAME(SCh.name) + '.' + QUOTENAME(ST.NAME) ; 


     UPDATE @SQLTbl 
     SET SQLStatement = 'SELECT * INTO SearchTMP FROM ' + Tablename + ' WHERE ' + substring(WHEREClause,1,len(WHEREClause)-5) 

     DELETE FROM @SQLTbl 
     WHERE WHEREClause IS NULL 

    WHILE EXISTS (SELECT 1 FROM @SQLTbl WHERE ISNULL(Execstatus ,0) = 0) 
    BEGIN 

     SELECT TOP 1 @tmpTblname = Tablename , @sql = SQLStatement 
      FROM @SQLTbl 
     WHERE ISNULL(Execstatus ,0) = 0 

     IF @GenerateSQLOnly = 0 
     BEGIN 

      IF OBJECT_ID('SearchTMP','U') IS NOT NULL 
       DROP TABLE SearchTMP 
      EXEC (@SQL) 

      IF EXISTS(SELECT 1 FROM SearchTMP) 
      BEGIN 
       SELECT [email protected],* FROM SearchTMP 
       SELECT @MatchFound = 1 
       END 

     END 
     ELSE 
     BEGIN 
      PRINT REPLICATE('-',100) 
      PRINT @tmpTblname 
      PRINT REPLICATE('-',100) 
      PRINT replace(@sql,'INTO SearchTMP','') 
     END 

     UPDATE @SQLTbl 
      SET Execstatus = 1 
      WHERE Tablename = @tmpTblname 

    END 

    IF @MatchFound = 0 
    BEGIN 
     SELECT @ErrMsg = 'No Matches are found in this database ' + DB_NAME() + ' for the specified filter' 
     PRINT @ErrMsg 
     RETURN 
    END 

    SET NOCOUNT OFF 

go 

何かコードの本当に柔軟な便利な一枚。

あなたは自分のDBAは本当にあなたが彼をして信頼していない、このスクリプトで使用されている変数を宣言すると、アドホッククエリとして

DECLARE @Tablenames VARCHAR(500) = 'Table_Name' 
DECLARE @SearchStr NVARCHAR(60) = 'Data_LookingFor' 
DECLARE @GenerateSQLOnly Bit = 0 

をスクリプトを実行procsのを作成する権限を持っていない場合:)とにかく、私はもう少しではなくテーブル変数よりも、一時テーブルを利用して、コードを微調整している、多分これはあなたのために動作します:

DECLARE @Tablenames VARCHAR(500) = 'Table_name' 
DECLARE @SearchStr NVARCHAR(60) = 'Serach_String' 
DECLARE @GenerateSQLOnly Bit = 0 



    SET NOCOUNT ON 

    DECLARE @MatchFound BIT 

    SELECT @MatchFound = 0 

    IF OBJECT_ID('tempdb..#CheckTableNames') IS NOT NULL 
    DROP TABLE #CheckTableNames 

    CREATE Table #CheckTableNames 
    ( 
    Tablename sysname 
    ) 

    IF OBJECT_ID('tempdb..#SQLTbl') IS NOT NULL 
    DROP TABLE #SQLTbl 


    CREATE TABLE #SQLTbl 
    ( 
    Tablename  SYSNAME 
    ,WHEREClause VARCHAR(MAX) 
    ,SQLStatement VARCHAR(MAX) 
    ,Execstatus  BIT 
    ) 

    DECLARE @sql VARCHAR(MAX) 
    DECLARE @tmpTblname sysname 
    DECLARE @ErrMsg VARCHAR(100) 

    IF LTRIM(RTRIM(@Tablenames)) IN ('' ,'%') 
    BEGIN 

     INSERT INTO #CheckTableNames 
     SELECT Name 
      FROM sys.tables 
    END 
    ELSE 
    BEGIN 

     SELECT @sql = 'SELECT ''' + REPLACE(@Tablenames,',',''' UNION SELECT ''') + '''' 

     INSERT INTO #CheckTableNames 
     EXEC(@sql) 

    END 

    IF NOT EXISTS(SELECT 1 FROM #CheckTableNames) 
    BEGIN 

     SELECT @ErrMsg = 'No tables are found in this database ' + DB_NAME() + ' for the specified filter' 
     PRINT @ErrMsg 
     RETURN 

    END 

    INSERT INTO #SQLTbl 
    (Tablename,WHEREClause) 
    SELECT QUOTENAME(SCh.name) + '.' + QUOTENAME(ST.NAME), 
      ( 
       SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10) 
        FROM SYS.columns SC 
        JOIN SYS.types STy 
        ON STy.system_type_id = SC.system_type_id 
        AND STy.user_type_id =SC.user_type_id 
       WHERE STY.name in ('varchar','char','nvarchar','nchar') 
        AND SC.object_id = ST.object_id 
       ORDER BY SC.name 
       FOR XML PATH('') 
      ) 
     FROM SYS.tables ST 
     JOIN #CheckTableNames chktbls 
       ON chktbls.Tablename = ST.name 
     JOIN SYS.schemas SCh 
     ON ST.schema_id = SCh.schema_id 
    WHERE ST.name <> 'SearchTMP' 
     GROUP BY ST.object_id, QUOTENAME(SCh.name) + '.' + QUOTENAME(ST.NAME) ; 


     UPDATE #SQLTbl 
     SET SQLStatement = 'SELECT * INTO SearchTMP FROM ' + Tablename + ' WHERE ' + substring(WHEREClause,1,len(WHEREClause)-5) 

     DELETE FROM #SQLTbl 
     WHERE WHEREClause IS NULL 

    WHILE EXISTS (SELECT 1 FROM #SQLTbl WHERE ISNULL(Execstatus ,0) = 0) 
    BEGIN 

     SELECT TOP 1 @tmpTblname = Tablename , @sql = SQLStatement 
      FROM #SQLTbl 
     WHERE ISNULL(Execstatus ,0) = 0 

     IF @GenerateSQLOnly = 0 
     BEGIN 

      IF OBJECT_ID('SearchTMP','U') IS NOT NULL 
       DROP TABLE SearchTMP 
      EXEC (@SQL) 

      IF EXISTS(SELECT 1 FROM SearchTMP) 
      BEGIN 
       SELECT Tablename = @tmpTblname,* FROM SearchTMP 
       SELECT @MatchFound = 1 
       END 

     END 
     ELSE 
     BEGIN 
      PRINT REPLICATE('-',100) 
      PRINT @tmpTblname 
      PRINT REPLICATE('-',100) 
      PRINT replace(@sql,'INTO SearchTMP','') 
     END 

     UPDATE #SQLTbl 
      SET Execstatus = 1 
      WHERE Tablename = @tmpTblname 

    END 

    IF @MatchFound = 0 
    BEGIN 
     SELECT @ErrMsg = 'No Matches are found in this database ' + DB_NAME() + ' for the specified filter' 
     PRINT @ErrMsg 
     RETURN 
    END 
+0

エラーメッセージ: メッセージレベル102、レベル15、状態1、プロシージャSP_SearchTables、行171 'OFF'に近い構文が正しくありません。 – Sewder

+0

申し訳ありませんコードを編集してもう一度試してみてください。 –

+0

ありがとう、Muhammed、これは本当に便利です残念ながら、私はこのデータベースのためのCREATE PROCEDURE権限を持っていません。プロシージャを作成せずにこれを行う方法がありますか?私は多分この質問に言及すべきだった。編集中です。 – Sewder

関連する問題