Hi, This should work for you.
IF EXISTS (Select Name FROM Utility.sys.objects Where name ='tfnStringParser')
BEGIN
DROP FUNCTION dbo.tfnStringParser
END
GO
CREATE FUNCTION [dbo].[tfnStringParser]
(
@inputString Varchar(8000),
@Delimiter CHAR(1)
)
RETURNS
@parsedValues TABLE (ParsedColumn VARCHAR(200))
AS
BEGIN
DECLARE @spos INT
DECLARE @epos INT
IF RIGHT(@inputString,1)<> @Delimiter
SET @inputString= @InputString + @Delimiter
SET @spos =1
WHILE CHARINDEX(@delimiter,@InputString,@spos) <> 0
BEGIN
SET @epos=CHARINDEX(@delimiter,@inputString,@spos)
Insert into @parsedValues
SELECT SUBSTRING(@InputString,@spos,@epos - @spos)
SET @spos =@epos +1
END
RETURN
END
GO
DECLARE @Columns NVARCHAR(4000)
DECLARE @SQLstr NVARCHAR(MAX)
SET @Columns =''
SET @SQLstr = ''
--Just using your example, this table could be any size.
CREATE TABLE skill(Skill VARCHAR(15),BU1 INT,BU2 INT , BU3 INT)
INSERT INTO skill (Skill,BU1,BU2,BU3)
VALUES
('Skill1', 0, 0, 0),
('Skill2', 2, 6, 0),
('Skill3', 0, 0, 7),
('Skill4', 4, 0, 0),
('Skill5', 0, 7, 8)
SELECT @Columns = @Columns + COLUMN_NAME +','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='SKILL' and COLUMN_NAME Like 'BU%'
SELECT @Columns= LEFT(@Columns,LEN(@Columns)-1)
SELECT @SQLstr = @SQLstr + 'SELECT ''' +[ParsedColumn] +''',SKILL,' + [ParsedColumn] + ' as [Value] FROM Skill UNION ALL' +CHAR(13)
FROM [Utility].[dbo].[tfnStringParser] (@Columns,',')
SELECT @SQLStr =LEFT(@SQLStr,LEN(@SQLStr)- (LEN('UNION ALL')+1))
EXEC(@SQLSTR)
DROP TABLE skill