2017-08-09 55 views
0

我已經從表中將列名稱加載到名爲#COLUMN_NAMES的臨時表中。我想建立一個while循環,通過我在下面創建的#Data_Quality_Check表中傳遞臨時表中的每一行。如何使用SQL Server 2014構建WHILE循環

當前在我的表#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

Dynamic badboy。您需要先創建空臨時表,但

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

這是我嘗試運行時得到的錯誤。 Msg 102,Level 15,State 1,Line 7 '@mcnt'附近語法不正確。 Msg 102,Level 15,State 1,Line 13 '@column_name'附近語法不正確。 Msg 156,Level 15,State 1,Line 16 關鍵字'over'附近的語法不正確。 –

+0

@DanielBailey'over'是一個錯字,應該是括號(查找窗口函數)。我的tSQL有點生疏 – JohnHC