如何使用SQL Server 2014构建WHILE循环

时间:2017-08-09 14:54:47

标签: sql sql-server-2014

我已将表中的列名加载到名为#COLUMN_NAMES的临时表中。我想构建一个while循环,它通过我在下面创建的#Data_Quality_Check表来传递临时表中的每一行。

目前我的表#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 个答案:

答案 0 :(得分:1)

动态那个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;