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

テーブル内の列の特定の行データを見つけるためにデータベースを調べることができるようなものはありますか?

例: c.name = GUITARS および GUTARS = 'Fender' の場合

編集:CREATE PROCEDURE権限またはCREATE TABLEを持っていません

特定の列名で特定のデータを探すだけでは、多くの行が返されても問題ありません。

4

3 に答える 3

2

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

パラメータと使用法:

@Tablenames -- 単一のテーブル名または複数のテーブル名をコンマで区切って指定します。

空白のままにすると、データベース内のすべてのテーブルがチェックされます

@SearchStr -- 検索文字列を提供します。「%」を使用して検索を行います。

例: X%--- X で始まるデータを返します

%X--- X で終わるデータを返します

%X%--- X を含むデータを返します

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

デフォルトでは 0 で、検索します。

    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 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 

    SET NOCOUNT OFF 

go 

ソルナ・クマール・ムトゥラジ

私が仕事で使用するものは、非常に柔軟で便利なコードです。

proc を作成する権限がない場合は、このスクリプトで使用されている変数を宣言し、アドホック クエリとしてスクリプトを実行します。

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

あなたのDBAは本当にあなたを信頼していません:) とにかく、テーブル変数ではなく一時テーブルを利用してコードをもう少し微調整しました。おそらくこれでうまくいくでしょう:

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 
于 2013-10-09T17:51:04.587 に答える
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 のテーブルが提供されるとします。結果セットを見ることができ、使用可能なテーブルをほぼ知ることができます。推測したアイテムのリストで Fenders を検索します。

私はERPアプリのメンテナンスに取り組んでおり、6000以上のテーブルと13000以上の手順があるのでそう言っています。したがって、関連するテーブルを見つける必要があるときはいつでも、同じトリックを使用するだけで機能します。

于 2013-10-09T17:38:11.073 に答える