2017-08-09 10 views
0

テーブルの列名を#COLUMN_NAMESという一時テーブルにロードしました。私はtempテーブルの各行を下に作成した#Data_Quality_Checkテーブルに渡すwhileループを作成したいと考えています。SQL Serverを使用してWHILEループを構築する方法2014

私のテーブル#Column_namesには現在54行のcolumn_namesがあります。理想的には、whileループで各変数を処理し、出力を#Data_Quality_Checkテーブルに入れたいとします。

if object_id('tempdb..#COLUMN_NAMES') is not null 
    drop table #COLUMN_NAMES 

SELECT COLUMN_NAME AS Column_Names 
INTO #COLUMN_NAMES 
FROM information_schema.columns  
WHERE table_name = 'ssrs_sourcedata' 

----- >>>> !!!!!! INSERT CODE TO BUILD WHILE LOOP !!!! 

if object_id('tempdb..#DATA_QUALITY_CHECK') is not null 
    drop table #DATA_QUALITY_CHECK 

SELECT 
    periodenddate, 
    '@Column_Name' AS Label, 
    MIN(@Column_Name) AS Min_Value, 
    MAX(@Column_Name) AS Max_Value, 
    SUM(@Column_Name) AS Sum_Value, 
    AVG(@Column_Name) AS Avg_Value, 
    SUM(Case when @Column_Name IS NULL THEN 1 ELSE 0 END) AS Null_Count, 
    SUM(Case when len(cast(@Column_Name AS VARCHAR)) = 0 THEN 1 ELSE 0 END) AS Space_Count, 
    MAX(len(cast(@Column_Name AS VARCHAR))) AS max_length, 
    MIN(len(cast(@Column_Name AS VARCHAR))) AS min_length 
INTO 
    #DATA_QUALITY_CHECK  
FROM 
    dbcrms.report.ssrs_sourcedata 
WHERE 
    periodenddate = '2017-06-30' 
GROUP BY 
    periodenddate 
+1

UDFのように見えるかもしれません。 –

答えて

1

ダイナミックなその悪いボーイ。最初に空のテンポラリテーブルを作成する必要があります。

declare @cnt int = 1; 
declare @mcnt int; 
declare @vsql varchar(2000); 
declare @column_name varchar(100); 

select @mcnt = count(*)  
from #COLUMN_NAMES; 

while @cnt <= @mcnt 
begin 
select @column_name = column_names 
from 
(
select column_names, row_number() over(order by column_names) rn 
from #COLUMN_NAMES 
) 
where rn = @cnt; 

set @vsql = 'insert into #DATA_QUALITY_CHECK (Label, min_value, max_value, sum_value, avg_value, null_count, space_count, max_length, min_length) 
SELECT periodenddate, ''' + @Column_Name + ''' AS Label, 
MIN(' + @Column_Name+ ') AS Min_Value, 
MAX(' + @Column_Name + ') AS Max_Value, 
SUM(' + @Column_Name + ') AS Sum_Value, 
AVG(' + @Column_Name + ') AS Avg_Value, 
SUM(Case when ' + @Column_Name + ' IS NULL THEN 1 ELSE 0 END) AS Null_Count, 
SUM(Case when len(cast(' + @Column_Name + ' AS VARCHAR)) = 0 THEN 1 ELSE 0 END) AS Space_Count, 
MAX(len(cast(' + @Column_Name + ' AS VARCHAR))) AS max_length, 
MIN(len(cast(' + @Column_Name + ' AS VARCHAR))) AS min_length 
FROM dbcrms.report.ssrs_sourcedata WHERE periodenddate = '2017-06-30' 
GROUP BY periodenddate '; 

execute(@vsql); 
set @cnt = @cnt + 1; 
end; 
+0

これを実行しようとしたときに発生したエラーです。 メッセージ102、レベル15、状態1、行7 '@mcnt'の近くの構文が正しくありません。 メッセージ102、レベル15、状態1、行13 '@column_name'の近くの構文が正しくありません。 メッセージ156、レベル15、状態1、行16 'over'というキーワードの構文が正しくありません。 –

+0

@DanielBailey 'over'はブラケット(ルックアップウィンドウ関数)と思われるタイプミスです。私のtSQLは少し錆びている – JohnHC

関連する問題