我想創建函數在另一個表中TBL_Sku
柱(sku
)的值被劃分到任何柱(SKU1,2,3,4,...)(TBL_Sku2
)如何將列的值拆分爲SQL Server中的動態列?
柱sku
在TBL_SkU
:
ROW1列德:1-Acer Aspire 3811TZG 1GB DDR3-1066 PC8500 Memory Module,SKU:
1GBDDR3-1066-21,&2-Acer Aspire 3811TZG 2GB DDR3-1066 PC8500 Memory Module,SKU: 2GBDDR3-1066-21,&3-Acer Aspire 3811TZG 4GB DDR3-1066 PC8500 Memory Module,SKU: 4GBDDR3-1066-414,&
和在列第2行德:1-SKU: 512MBDDR2-533-1038,Sony VAIO PCG-1J1L 512MB DDR2-533 PC4200 Memory Module,&
和在列第3行德:1-MSI S271 1GB DDR2-533 PC4200 Memory Module,SKU: 1GBDDR2-533-1068,&2-MSI S271 512MB DDR2-533 PC4200 Memory Module,SKU: 512MBDDR2-533-1033,&
輸出:
TBL_Sku2:
id sku1 sku2 sku3 sku4 sku5
--- ----------- ----------------- ------------------- ----------------- ---------
1 1GBDDR3-1066-21 2GBDDR3-1066-21 4GBDDR3-1066-414 Null Null
2 512MBDDR2-533-1038 null null null null
3 1GBDDR2-533-1068 512MBDDR2-533-1033 Null Null Null
我想專業的功能。稍後爲您發送我的代碼。使用在子和CHARINDEX
SP:
ALTER PROCEDURE [dbo].[SP_SpilitSKU]
(@ID int ,@SKU nvarchar(Max))
AS
BEGIN
Declare @YourTable table (ID int,SKU varchar(max))
Insert Into @YourTable values
(@ID,@SKU)
;with cte as (
Select A.ID
,RN = Row_Number() over (Partition By ID Order by RetSeq)
,SKU = LTrim(RTrim(Replace(RetVal,'SKU:','')))
From @YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>'+ replace((Select A.SKU as [*] For XML Path('')),',','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B
Where RetVal like 'SKU:%'
)
INSERT INTO [dbo].[TBL_Sku]
(id
,[SKU1]
,[SKU2]
,[SKU3]
,[SKU4]
,[SKU5]
,[SKU6]
)
Select ID,[1] as SKU1,[2] as SKU2,[3] as SKU3,[4] as SKU4,[5] as SKU5,[6] as SKU6
From cte
Pivot (max(SKU) For [RN] in ([1],[2],[3],[4],[5],[6])) p
SP:在表
ALTER PROCEDURE [dbo].[SP_CreateTableSku4Column]
AS
BEGIN
declare @DesOrginal as nvarchar(max);
Declare @i as int = 0;
Declare @Count as int = (select COUNT(des) from TBL_Product_Test);
while (@i<= @Count)
Begin
WITH TBL_SKUTemp AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT null)) AS 'RowNumber',[des]
FROM TBL_Product_Test
)
SELECT @DesOrginal = [des]
FROM TBL_SKUTemp
WHERE RowNumber = @i+1;
set @i = @i+1;
EXECUTE [dbo].[SP_SpilitSKU] @i,@DesOrginal ;
END
END
影響數列梅= 15563
在TBL_Sku = 8449
(1 row(s) affected)
8449
15563
des = 1-Samsung NP940X5JI (NP940X5J-S01US) 4GB DDR3L-1600 PC12800 1.35V Memory Module,SKU: 4GBDDR3L-1600-9,&
(1 row(s) affected)
(0 row(s) affected)
8450
15563
des = 1-SKU: 512MBDDR2-533-1038,Sony VAIO PCG-1J1L 512MB DDR2-533 PC4200 Memory Module,&
其他方法:
declare @DesOrginal as nvarchar(max);
Declare @i as int = 0;
Declare @Count as int = (select COUNT(des) from TBL_Product_Test);
while (@i<= @Count)
begin
WITH TBL_SKUTemp AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT null)) AS 'RowNumber',[des]
FROM TBL_Product_Test
)
SELECT @DesOrginal = [des]
FROM TBL_SKUTemp
WHERE RowNumber = @i+1;
set @i = @i+1;
DECLARE @str VARCHAR(8000)[email protected],
@col_list VARCHAR(1000)='',
@sql NVARCHAR(max)
SET @col_list =(SELECT Concat(',', Quotename(Concat('sku', Row_number()
OVER(
ORDER BY ItemNumber))))
FROM dbo.Delimitedsplit8k(@str, ',sku:')
WHERE Item LIKE 'sku:%'
FOR xml path(''))
SET @col_list = Stuff(@col_list, 1, 1, '')
SET @sql = 'SELECT *
FROM (SELECT Concat(''sku'',Row_number()OVER(ORDER BY ItemNumber)) rn,
Stuff(item, 1, 5, '''') AS item
FROM dbo.Delimitedsplit8k(@str, '',sku:'')
WHERE Item LIKE ''sku:%'') a
PIVOT (Max(item)
FOR rn IN (' + @col_list + ')) pv '
--PRINT @sql
EXEC Sp_executesql
@sql,
N'@str VARCHAR(8000)',
@str= @str
INSERT INTO [dbo].[TBL_Sku6]
([SKU1]
,[SKU2]
,[SKU3]
,[SKU4]
,[SKU5]
)SELECT *
FROM (SELECT Concat('sku',Row_number()OVER(ORDER BY ItemNumber)) rn,
Stuff(item, 1, 5, '') AS item
FROM dbo.Delimitedsplit8k(@str, ',sku:')
WHERE Item LIKE 'sku:%') a
PIVOT (Max(item)
FOR rn IN (" + @col_list + ")) pv
print @i
print @Count
--print @str
--print RowNumber
print 'des = '[email protected]
--PRINT @sql
----print SKU
----print RetVal
----print RetSeq
------print cte
end
TBL_Sku6:
TABLE [dbo].[TBL_Sku6](
[SKU1] [varchar](7996) NULL,
[SKU2] [varchar](7996) NULL,
[SKU3] [varchar](7996) NULL,
[SKU4] [varchar](7996) NULL,
[SKU5] [varchar](7996) NULL,
[SKU6] [varchar](7996) NULL
) ON [PRIMARY]
錯誤
INSERT語句的選擇列表包含多於插入列表中的項目少。 SELECT值的數量必須與INSERT列的數量相匹配。
我認爲你需要先將字符串轉換爲表格然後進行轉換。我已經做了同樣的事給我5分鐘我會拿出解決方案 –
值在表中@YashveerSingh,列類型是nvarchar(最大) – RedArmy
謝謝@YashveerSingh – RedArmy