Tsql 如何将长VARCHAR文本拆分为一列中的每个单词

Tsql 如何将长VARCHAR文本拆分为一列中的每个单词,tsql,split,word,Tsql,Split,Word,我希望将例如“黑色花岗岩灶台到t形,54 x 26”拆分为单独的列,每个列都有简单的t-sql代码,而不是复杂的逻辑 with C1 as ( select ProductName, SUBSTRING(ProductName, 1, CHARINDEX(' ', ProductName)) as firstword, SUBSTRING(ProductName, CHARINDEX(' ', ProductName), LEN(ProductName)) as secondword fr

我希望将例如“黑色花岗岩灶台到t形,54 x 26”拆分为单独的列,每个列都有简单的t-sql代码,而不是复杂的逻辑

with C1 as 
(
select ProductName, SUBSTRING(ProductName, 1, CHARINDEX(' ', ProductName))  as firstword,
SUBSTRING(ProductName, CHARINDEX(' ', ProductName), LEN(ProductName))  as secondword
from [dbo].[AProducts]
),
C2 AS 
(
select firstword, secondword
from C1
)

select firstword, SUBSTRING(secondword, 1, CHARINDEX(' ', secondword)) as z from C2
这是PRODUCTNAME摘录:

To credit against Invoice 104 - overcharged in error
Black Granite Hearth to t-shape, 54 x 26
Black Granite Header 38 x 5, Slips 32 x 5
Nero Zimbabwe 30mm worktops, supplied and fitted

奇怪的要求去水平与垂直。如果不使用动态,您可能会丢失单词,但以下内容在必要时很容易扩展

范例

返回


请不要对我们大喊大叫。没有理由把你的问题全部用大写字母写出来。它不会让你更快地得到答案,它会使文本更难阅读,而且它真的很粗鲁和烦人。当你查看主页上列出的所有帖子时,除了你自己的以外,你看不到任何其他帖子,因为这样做是不合适的。现在请停止。请阅读一些关于改进您的问题的提示。使用适当的软件MySQL、Oracle、DB2等标记数据库问题是很有帮助的。。。和版本,例如sql-server-2014。语法和特征的差异通常会影响答案。
Declare @YourTable table (PRODUCTNAME varchar(max))
Insert Into @YourTable values
 ('To credit against Invoice 104 - overcharged in error')
,('Black Granite Hearth to t-shape, 54 x 26')
,('Black Granite Header 38 x 5, Slips 32 x 5')
,('Nero Zimbabwe 30mm worktops, supplied and fitted')

Select A.*
      ,C.*
 From  @YourTable A
 Cross Apply ( Select CleanString = replace(replace(replace(A.ProductName,' x ','x'),',',''),' - ',' ') ) B
 Cross Apply (
                Select Pos1  = ltrim(rtrim(xDim.value('/x[1]' ,'varchar(max)')))
                      ,Pos2  = ltrim(rtrim(xDim.value('/x[2]' ,'varchar(max)')))
                      ,Pos3  = ltrim(rtrim(xDim.value('/x[3]' ,'varchar(max)')))
                      ,Pos4  = ltrim(rtrim(xDim.value('/x[4]' ,'varchar(max)')))
                      ,Pos5  = ltrim(rtrim(xDim.value('/x[5]' ,'varchar(max)')))
                      ,Pos6  = ltrim(rtrim(xDim.value('/x[6]' ,'varchar(max)')))
                      ,Pos7  = ltrim(rtrim(xDim.value('/x[7]' ,'varchar(max)')))
                      ,Pos8  = ltrim(rtrim(xDim.value('/x[8]' ,'varchar(max)')))
                      ,Pos9  = ltrim(rtrim(xDim.value('/x[9]' ,'varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(B.CleanString,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as X
             ) C