2017-08-09 53 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