asked on
create TABLE tblSource(
f1 varchar(10)
,f2 varchar(10)
,fn varchar(10)
)
insert into tblSource (f1,f2,fn)
values('C','R','Q'),('B','X',NULL),('D',NULL,NULL),('B','P','P'),('A','X',NULL)
go
create procedure abcd
(
@tblsource VARCHAR(100)
,@tbltarget varchar(100)
,@no_of_cols int
)
AS
BEGIN
declare @select varchar(max),@where varchar(max),@sql varchar(max)
-- Get the column names
SELECT @where = STUFF(( SELECT ',['+ COLUMN_NAME+']'
FROM INFORMATION_SCHEMA.columns where table_name = @tblsource and ORDINAL_POSITION <= @no_of_cols
ORDER BY ',['+ COLUMN_NAME+']'
FOR XML PATH('')), 1, 1, '')
-- Create the target table
select @sql = '
IF OBJECT_ID('''+@tblTarget+''') IS NOT NULL
DROP TABLE ' + @tblTarget +'
select '+@where+ '--, 0 AS OrderBy
into '+@tblTarget+' from ' + @tblSource + ' where 1 = 0'
exec(@sql)
select @select = substring(select_list,1,len(select_list)-5)
from (
select stuff((select 'SELECT ''' + COLUMN_NAME + ''' colname,'+COLUMN_NAME+' data FROM ' + @tblsource + ' WHERE ISNULL('+COLUMN_NAME+','''') <> '''' UNION '
from INFORMATION_SCHEMA.columns where table_name = @tblsource and ORDINAL_POSITION <= @no_of_cols
order by COLUMN_NAME
for xml path(''),
type).value('.','nvarchar(max)')
, 1, 0, '') as select_list) t1
select @sql = '
;with cte as (
select *,ROW_NUMBER() over (partition by colname order by data) rn
from ('+@select+') t1)
insert ' + @tblTarget + '
select distinct '+@where+'--,1
from cte
pivot (max(data) for colname in ('+@where+') ) p'
exec(@sql)
--select @sql = '
--INSERT INTO ' + @tblTarget + '
--SELECT COUNT(DISTINCT ' +REPLACE(@where,',','),COUNT(DISTINCT ') + ')FROM ' + @tblTarget
select @sql = 'INSERT INTO '
+ @tblTarget
+ ' SELECT '
+ '''<'''
+ '+ convert(varchar,COUNT(DISTINCT '
+ REPLACE(@where,',',')) + ' + '''>''' + ' ,' + '''<''' + ' + convert(varchar,COUNT(DISTINCT ')
+ ')) + '
+ '''>'''
+ ' FROM '
+ @tblTarget
exec(@sql)
--select @sql = '
--SELECT ' + @where + '
--FROM ' + @tblTarget + '
--ORDER BY OrderBy'
--exec(@sql)
end