2017-08-09 2 views
0

J'ai chargé les noms de colonnes d'une table dans la table temporaire appelée #COLUMN_NAMES. Je voudrais construire une boucle while qui passe chacune des lignes de la table temporaire à travers ma table #Data_Quality_Check que j'ai créée ci-dessous.Comment créer une boucle WHILE à l'aide de SQL Server 2014

Il existe actuellement 54 lignes de noms_colonnes dans ma table #Column_names. Idéalement, j'aimerais que la boucle while traite chacune des variables et place la sortie dans le tableau #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

Cela ressemble peut-être à un bon cas pour un fichier UDF. –

Répondre

1

Dynamique que badboy. Vous devez d'abord créer la table temporaire vide.

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

C'est l'erreur que j'ai eue quand j'ai essayé de lancer ceci. Msg 102, niveau 15, état 1, ligne 7 Syntaxe incorrecte près de '@mcnt'. Msg 102, niveau 15, état 1, ligne 13 Syntaxe incorrecte près de '@column_name'. Msg 156, niveau 15, état 1, ligne 16 Syntaxe incorrecte à proximité du mot clé 'over'. –

+0

@DanielBailey le 'over' était une faute de frappe, supposé être des crochets (recherche des fonctions de la fenêtre). Mon tSQL est un peu rouillé – JohnHC