2017-12-04 11 views
1

私のデータベースで使用可能なすべてのテーブルのすべての列をループして、どの列に文字列 "Kroki Homes"が含まれているかをチェックします。ループthrogh特定の文字列を検索するすべてのデータ

私は約。私のデータベースの56テーブル。したがって、これらのテーブルのすべての列をチェックインするのは難しいです。 SQL Serverでこれを実現する簡単な方法はありますか?

答えて

1

プロシージャを1つ作成して、検索用の文字列を渡すことができます。これがあなたを助けるかもしれない場所をいくつか見つけました。

CREATE PROC [dbo].[SearchDataFromAllTables] (@SearchStr NVARCHAR(100)) 
AS 
BEGIN 

    SET NOCOUNT ON; 

    CREATE TABLE #Results 
    (
     ColumnName NVARCHAR(370), 
     ColumnValue NVARCHAR(3630) 
    ) 

    DECLARE @TableName NVARCHAR(256) 
      , @ColumnName NVARCHAR(128) 
      , @SearchStr2 NVARCHAR(110) 

    SET @TableName = '' 
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%', '''') 

    WHILE @TableName IS NOT NULL 
    BEGIN 
     SET @ColumnName = '' 
     SET @TableName = (
       SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_TYPE = 'BASE TABLE' 
        AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
        AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0 
       ) 

     WHILE (@TableName IS NOT NULL) 
      AND (@ColumnName IS NOT NULL) 
     BEGIN 
      SET @ColumnName = (
        SELECT MIN(QUOTENAME(COLUMN_NAME)) 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) 
         AND TABLE_NAME = PARSENAME(@TableName, 1) 
         AND DATA_TYPE IN (
          'char' 
          ,'varchar' 
          ,'nchar' 
          ,'nvarchar' 
          ) 
         AND QUOTENAME(COLUMN_NAME) > @ColumnName 
        ) 

      IF @ColumnName IS NOT NULL 
      BEGIN 
       INSERT INTO #Results 
       EXEC ( 
         'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
         FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
        ) 
      END 
     END 
    END 

    SELECT ColumnName, ColumnValue FROM #Results 

END 
+1

ありがとうございました。それは56のテーブルのすべての列で検索しますか? –

+0

はい。それは:)あなたはそれを試すことができます:) ;) – IamMOHIT

0

すべてのテーブルをスキャンするストアドプロシージャを作成する必要があります。

以下のスクリプトは、表と列を示しています。これから、実行中のSQLを作成し、テーブルからのSELECTに対して動的に実行する必要があります。詳細が必要な場合はお知らせください。

SELECT tb.name AS table_name, 
     c.name AS column_name, 
     c.column_id, 
     tp.name AS column_data_type, 
     c.max_length, 
     c.precision, 
     c.scale, 
     CASE c.is_nullable WHEN 1 THEN 'YES' ELSE 'NO' END AS is_nullable 
    FROM sys.tables tb, 
     sys.columns c, 
     sys.types tp 
    WHERE tb.object_id = c.object_id 
    AND SCHEMA_NAME(tb.schema_id) = 'dbo' 
    AND c.user_type_id = tp.user_type_id 
    ORDER BY table_name, column_id; 
+0

ありがとうRamesh。上の答えで私はinformational_schema.tablesが使用されて参照してくださいあなたの答えで私はsys.tablesを参照してください。これら2つの間に違いはありますか? –

+0

情報スキーマは不完全で、常に信頼できるとは限りません - [INFORMATION_SCHEMAビューに対するケース](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views .aspx)ですが、ANSI標準と同じように移植性が高くなります。それは本当にあなたが2つの悪のうちの小さいものであると感じるものに依存します。 – GarethD

+0

このリンクを参照してください。https://stackoverflow.com/questions/46187767/difference-between-information-schema-vs-sys-tables-in-sql-server – IamMOHIT

関連する問題