0

データベース内のテーブルのデータ品質に関するいくつかの基本的なメトリックを取得できるようにするスクリプトを作成しています。これを行う方法は、各列に存在する空白フィールド、null などをカウントすることです。私には2つの明確な問題があります。1 つ目はエラー処理を扱い、2 つ目は SQL I/O を扱います。

エラー処理: 提供されたすべてのテーブルと列を相互に処理するカーソルを作成しました。列の 90% で LONG としてキャストする必要がありましたが、他の列の一部には文字が含まれているため、無効な変換エラーが発生します。エラーが発生しないように、キャストする前に列のデータ型を Varchar/Text に比較する if ステートメントを設定するにはどうすればよいですか?

SQL 出力:カーソルを実行した後、データを csv または txt ファイルに移動する必要があります。私はデータベースへの読み取りアクセス権しか持っていないので、手順を書いたり、BCP を実行したりすることはできません。この問題を回避する方法はありますか?

--Declare a table variable to hold your table names (and column names in case needed)

@listOfTablesToUpdate テーブルを宣言します (tableName varchar(100), columnNameToUpdate varchar(50))

ご協力いただきありがとうございます、

RP

--insert the tables that you want to work with.
--insert into @listOfTablesToUpdate values ('customer_ref', 'aml_rec_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'customer_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'bank_num')
insert into @listOfTablesToUpdate values ('customer_ref', 'peer_grp_cd')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_crd_rating')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_income')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_net_worth')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_invest_obj')
insert into @listOfTablesToUpdate values ('customer_ref', 'last_ofac_scan')
insert into @listOfTablesToUpdate values ('customer_ref', 'relationship_mgr_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'relationship_typ_cd')
insert into @listOfTablesToUpdate values ('customer_ref', 'tss_kyc_risk_rating')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_addr_link_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'customer_parent_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'status_cd')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_description_cd')
insert into @listOfTablesToUpdate values ('customer_ref', 'fin_entity')
insert into @listOfTablesToUpdate values ('customer_ref', 'ultimate_parent_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'cust_create_date')
insert into @listOfTablesToUpdate values ('customer_ref', 'si_lob_cd')
insert into @listOfTablesToUpdate values ('customer_ref', 'ges_ucn_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'employee_ind')
insert into @listOfTablesToUpdate values ('customer_ref', 'nds_lob_cd')
insert into @listOfTablesToUpdate values ('customer_ref', 'lcl_fin_entity')
insert into @listOfTablesToUpdate values ('customer_ref', 'business_line')
insert into @listOfTablesToUpdate values ('customer_ref', 'system_feeder_id')
insert into @listOfTablesToUpdate values ('customer_ref', 'last_update_date')

--Cursor for iterating
declare @tableCursor cursor,
        @tableName varchar(100),
        @tableName_ret varchar(100),
        @columnName varchar(50)


set @tableCursor = cursor for select tableName,columnNameToUpdate from @listOfTablesToUpdate

open @tableCursor
fetch next from @tableCursor into @tableName, @columnName
while(@@fetch_status = 0)

begin
    --dynamic sql
   declare @sqlCommand varchar(1000)
   declare @sqlCommand2 varchar(1000)

    --Your logic here...this is just an example
Set @sqlCommand = 'Select
max(' +@columnName + ') as Max_Value_' +@columnName +', ' +
'
min(' + @columnName + ') as Min_Value_' +@columnName + ', ' +
'
Cast(sum (case when Cast(' + @columnName + ' as FLOAT) =0 then 1.0 else 0 end) as FLOAT) as ZeroCount, ' +
'
Count(Distinct(' + @columnName + ')) as DistinctCount

 from AML.dbo.' + @tableName
Exec(@sqlCommand)

 Set @sqlCommand2 = 'Select
 count(*) as Null_SpaceCount
 from AML.dbo.' + @tableName + '
 where (' + @columnName + ' is null) or (len(ltrim(' + @columnName + '))=0 or len(rtrim(' + @columnName + '))=0)'

 Exec(@sqlCommand2)

  fetch next from @tableCursor into @tableName, @columnName
end

close @tableCursor
deallocate @tableCursor

-- max(' +@columnName + ') as Max_Value``
4

1 に答える 1

0

SQLCMDスクリプトの実行に使用している場合は、-o output_fileオプションを使用できます。

于 2012-11-27T22:00:30.790 に答える