2017-06-08 6 views
-1

私のグループが取得している新しいデータセットにデータ品質のスクリプトの配列を設定しようとしています。私が追跡しておきたい問題の1つは、nullsを含むフィールドのリストを維持することです。私たちは特定のフィールドをnullに許可していないので、bulk insertをブロックしたくないけれども、いくつかのフィールドは大丈夫です。T-SQL:NULLSを持つフィールドのリストを返すテーブルを照会するには

例:

SELECT [columns] 
FROM [TABLE] T 
WHERE [columns] CONTAINS NULLS 
+0

もう一度質問がありますか?ヌルにすることができないフィールドを知りたい場合は、カラムがヌル可能でないシステムテーブルを照会することができます。https://stackoverflow.com/questions/5204684/query-to-check-カラムがヌルであるかどうかを確認するために特定のテーブル統計を実際に知りたいのですか?いずれにしても:https://stackoverflow.com/questions/16852021/how-can-i-inexpensively-determine-if-a-column-contains-only-null-recordsいずれにしても、これは重複した質問のようです。 – xQbert

+0

さらに2番目のリンクに似ていますが、データにNULLが含まれている場合は、フィールドの名前が表示されます。これらのフィールドではnullが許されますが、理想的にはnullは必要ありません。 – plankton

+0

カラムに「不正な」値が含まれていることがわかっても、データ品質のスクリプトではそれほど役に立ちません。問題を修復するために必要な情報、またはそれを引き起こした原因に関するコンテキストは含まれていません。私は、監査テーブルに不正な行を書き込むトリガを提案します。完全な記録で、あなたは実際にあなたのトラブルの原因を見つけ出し、それを修正することができます。 – Greenspark

答えて

1

あなたはすべての列を通してループに機能して、このようなものを使用し、テーブル内のNULL値のカウントがあるかどうかを確認できます。コードは一種の力であるが、うまくいく。

declare @tablename nvarchar(255) = 'schema.tablename' 

declare @results table (ColumnName nvarchar(255)) 

/* Declare the Variables to be used in the cusor*/ 
declare @column_name nvarchar(255) 


/* Declare the cursor and the value set that will be used*/ 
declare tbl_Crawler cursor 
    for SELECT name FROM sys.columns 
     WHERE object_id = OBJECT_ID(@tablename) 

/* Make the Cursor Available*/ 
open tbl_Crawler 

/*Load the first row into the variables (must match sequence in cursor select)*/ 
fetch next from tbl_Crawler 
    into @column_name 

/*Creates While loop that will run until the curor is empty*/ 
while @@fetch_status = 0 
    begin 

/*statement to be run every loop of the cursor*/ 

    DECLARE @sqlCommand nvarchar(1000) 

    declare @counts int 

    SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM '[email protected]+' WHERE '+ @column_name + ' is null' 
    EXECUTE sp_executesql @sqlCommand, N'@cnt int OUTPUT', @[email protected] OUTPUT 


    if (isnull(@counts,0) > 0) 
     insert into @results 
     select @column_name 

/*Loads the next row of records into the variables (must match sequence in cursor select)*/ 
    fetch next from tbl_Crawler 
     into @column_name 
    end 
/*Release the cursor so that it is not retained in memory*/ 
close tbl_Crawler 
deallocate tbl_Crawler 

/* if in function return @results*/ 
    select * from @results 
+0

問題を回避するには、[QuoteName'](https://docs.microsoft.com/en-us/sql/t-sql/functions/quotename-transact-sql)にテーブル名とカラム名の変数をラップする必要があります"面白い"名前、例えば「Shoe Size」という名前の列にはスペースがあります。 – HABO

+0

あなたは本当に正しいです。コードは少し残しておきたい。 – SFrejofsky

1

これが遅いと醜いが、レッドゲートからツール購入の短いです(ら)、あなたの検索にISNULL(@コラム「MEをPICK」)でそれを修正することができるかもしれませんnulls ...

DECLARE @Query NVARCHAR(MAX), @Column NVARCHAR(100), @Table NVARCHAR(100) 
DECLARE @Search NVARCHAR(100) 
SET @Search = 'PICK ME' 

IF OBJECT_ID('tempdb.dbo.#Results2','U') IS NOT NULL 
    DROP TABLE tempdb.dbo.#Results2 

CREATE TABLE #Results2(Table_Name VARCHAR(100), Column_Name VARCHAR(100)) 

DECLARE Col CURSOR FOR 
SELECT Table_Name, Column_Name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLLATION_NAME IS NOT NULL 
ORDER BY TABLE_NAME, ORDINAL_POSITION 

OPEN Col 
FETCH NEXT FROM Col INTO @Table, @Column 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @Query = 'IF EXISTS (SELECT * FROM '+QUOTENAME(@Table)+' WHERE '+QUOTENAME(@Column)+'='''[email protected]+''') 
        SELECT '''[email protected]+''','''[email protected]+'''' 

    INSERT INTO #Results2 
    EXEC sp_executesql @Query 
    FETCH NEXT FROM Col INTO @Table, @Column 
END 
CLOSE Col 
DEALLOCATE Col 

SELECT * FROM #Results2 
関連する問題