2017-11-09 1 views
1

データベース全体で空白とNULL値を探すスクリプトがあります。技術的に言えば、データベースのスキーマです。データベース内のすべての空フィールドと空フィールドを検索します。列名だけを出力するには?

私は、次のリンクからスクリプトを修正:

COLUMN 1:テーブル名Search every table and field in a SQL Server Database Updated

問題は、私は私の出力として取得決勝2列は内部のフィールドとして、次の例と2列であるということです

[SCHEMA_NAME].[TABLE_NAME] 
[SCHEMA_NAME].[TABLE_NAME2] 
[SCHEMA_NAME].[TABLE_NAME2] 
[SCHEMA_NAME].[TABLE_NAME3] 
[SCHEMA_NAME].[TABLE_NAME4] 
...and so on 

カラム2:ColumnNameの

[SHCEMA_NAME].[TABLE_NAME].[COLUMN_NAME1] 
[SHCEMA_NAME].[TABLE_NAME2].[COLUMN_NAME1] 
[SHCEMA_NAME].[TABLE_NAME2].[COLUMN_NAME2] 
[SHCEMA_NAME].[TABLE_NAME3].[COLUMN_NAME1] 
[SHCEMA_NAME].[TABLE_NAME4].[COLUMN_NAME1] 
...and so on 

2番目の列からSCHEMA_NAMEとTABLE_NAMEを削除するにはどうすればよいのですか?そのため、column_nameを取得するだけです(その情報はすでにTableName上にあるためです)。

これまで説明したコードは、私が言及した出力を提供します。

DECLARE @SearchStr nvarchar(100) 
SET @SearchStr ='' 

    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))--,TableName varchar(200)) 

    SET NOCOUNT ON 

    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_SCHEMA = 'SAMPLE SCHEMA HERE' 
       AND 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', 'int', 'decimal') 
        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 + '=' + @SearchStr2 + 
        ' OR' + @ColumnName + ' IS NULL ' 
       ) 
      END 
     END 
    END 

     SELECT DISTINCT left(columnName, charindex('.', ColumnName, charindex('.',ColumnName)+1)-1) as tableName,ColumnName FROM #Results Order by tableName; 


       DROP TABLE #Results 

注:コードを実行したい場合は、「サンプルHERE SCHEMA」またはPARSENAMEを使用して、データベース全体

+0

?これはSQL Serverとよく似ています。 –

+1

私はSQL Server用に[PARSENAME](https://docs.microsoft.com/en-us/sql/t-sql/functions/parsename-transact-sql)を使用したいと思います。彼らが投稿したリンクから判断して@SeanLange私はあなたが正しいと思い、私はmysqlタグを削除したと思います。 – scsimon

+0

それはSQLサーバーです、私の悪いです。サイトの新機能では、偶然に提案されたタグをクリックしたと思う。 –

答えて

0

間で検索し、その行を削除し、あなたが言う行でスキーマを挿入することを確認してください最終的なSELECTを下記のスニペットで更新することができます。

SELECT 
    DISTINCT 
    left(columnName, charindex('.', ColumnName, charindex('.',ColumnName)+1)-1) as tableName, 
    parsename(ColumnName,1) as ColumnName 
    --quotename(parsename(ColumnName,1)) as ColumnName --if you want the brackets still 
FROM #Results 
Order by tableName; 

例を使用しているDBMS

declare @column varchar(256) = '[schema].[table].[column]' 

select parsename(@column,1) 
select quotename(parsename(@column,1)) --if you want the brackets still 
+0

助けてくれてありがとう! –

関連する問題