我已将表中的列名加载到名为#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
答案 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;