@ zineddine reda, попробуйте выполнить запрос ниже, вы можете сделать это с помощью функции pivot, предоставляемой sql
declare @Tbl table (code varchar(50), name varchar(50), Price int)
insert into @Tbl values ('001', 'item1', 113)
insert into @Tbl values ('002', 'item2', 90)
insert into @Tbl values ('003', 'item3', 45)
insert into @Tbl values ('004', 'item4', 47)
declare @Tbl1 table (ItemNAme nvarchar(50), ItemVal nvarchar(50))
insert into @Tbl1
Select 'Code',
STUFF((SELECT ', ' + Code
FROM @Tbl
FOR XML PATH('')), 1, 1, '')
from @Tbl
insert into @Tbl1
select 'Name',
STUFF((SELECT ', ' + name
FROM @Tbl
FOR XML PATH('')), 1, 1, '')
from @Tbl
insert into @Tbl1
select 'Price',
STUFF((SELECT ', ' + Convert(nvarchar(50),Price)
FROM @Tbl
FOR XML PATH('')), 1, 1, '')
from @Tbl
IF OBJECT_ID('tempdb..#Emp','U') IS NOT NULL DROP TABLE #Emp
SELECT E.*, P.Value AS ItemValue, 'ItemValue' + CONVERT(VARCHAR(10),P.ID) AS ItemValueID, P.ID AS ID
INTO #Emp
FROM @Tbl1 E OUTER APPLY dbo.fnSplit1(E.ItemVal,',') P
DECLARE @MaxID INT, @Cols VARCHAR(MAX), @SQL NVARCHAR(MAX), @i INT
SELECT @MaxID = MAX(ID) FROM #Emp
SET @i = 1
SET @Cols = ''
WHILE @i <=@MaxID
BEGIN
SET @Cols = @Cols + ', [ItemValue' + CONVERT(VARCHAR(10), @i) + ']'
SET @i = @i + 1
END
SET @Cols = RIGHT(@Cols, LEN(@Cols)-2)
print @Cols
SELECT @SQL = 'select ItemNAme, ' + @Cols + '
FROM (select ItemNAme, ItemVal, ItemValue, ItemValueID from #Emp) src
PIVOT (max(ItemValue) for ItemValueID IN (' + @Cols + '))pvt'
PRINT @SQL
EXECUTE (@SQL)
, и ваша функция fnSplit1 будет
CREATE FUNCTION [dbo].[FnSplit1]
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Value nvarchar(100)
)
AS
BEGIN
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END