Sql 拆分字符串字段以在表中创建2条记录

Sql 拆分字符串字段以在表中创建2条记录,sql,string,sql-server-2008,split,Sql,String,Sql Server 2008,Split,我有一个包含以下数据的表XX: REF Part DESC Model 1 6200050 Screw, #10-12 x 1/2" Pan HD UC-24C UC-24CI Cosmetic 2 7006474 Kickplate, Silver Svce UC-24C UC

我有一个包含以下数据的表XX:

REF        Part      DESC                                              Model
1    6200050     Screw, #10-12 x 1/2" Pan HD                    UC-24C UC-24CI Cosmetic
2    7006474     Kickplate, Silver Svce                     UC-24C UC-24CI Cosmetic
3    7002139     Cover, Unit Svce                           UC-24C UC-24CI Cosmetic
4    6201270     Screw, #8-18 x 5/8" PH PN SS-Gnd               UC-24C UC-24CI Cosmetic
6    7016528     Anti Tip Bracket - Svce - 23-7/8"              UC-24C UC-24CI Cosmetic
7    6200780     Screw, #10-24 x 1/2" PH Hex Washer             UC-24C UC-24CI Cosmetic

我需要做的是在字段中的两个型号之间拆分型号字段,为每个型号创建一个新记录,所有其他数据相同,并在每个记录的模型字段中保留扩展数据“示意性”一词。

只有当模型值具有以下模式Model1\u Model2\u somethingels时,此解决方案才有效,其中=空格分隔符,model[1 | 2]不包括空格:

SELECT ..., ca.Value
FROM dbo.MyTable t
CROSS APPLY
(
SELECT  unpvt.ColumnValue + N' ' + unpvt.ExtendedData AS Value
FROM (
    SELECT  LEFT(t.Model, a.Idx1 - 1) AS Model1,
            SUBSTRING(t.Model, a.Idx1 + 1, b.Idx2 - a.Idx1 - 1) AS Model2,
            SUBSTRING(t.Model, b.Idx2 + 1, 4000) AS ExtendedData
    FROM    (VALUES (CHARINDEX(' ', t.Model))) AS a(Idx1)
    CROSS APPLY (VALUES (CHARINDEX(' ', t.Model, a.Idx1+1))) AS b(Idx2)
) src UNPIVOT( ColumnValue FOR ColumnType IN  ([Model1], [Model2]) ) unpvt
) ca

下面是一段SQL语句,它将分解您的型号。你可以把它作为一个程序的一部分来做你想做的事情

declare @s varchar(255)
declare @m1 varchar(255)
declare @m2 varchar(255)
declare @p varchar(255)

set @s = 'UC-24C UC-24CI Cosmetic'

SET @m1 = SUBSTRING(@s, 0, CHARINDEX(' ',@s))
SET @s = LTRIM(RTRIM(SUBSTRING(@s, LEN(@m1 + ' ') + 1, LEN(@s))))
SET @m2 = SUBSTRING(@s, 0, CHARINDEX(' ',@s))
SET @p = LTRIM(RTRIM(SUBSTRING(@s, LEN(@m2 + ' ') + 1, LEN(@s))))

SET @m1 = @m1 + ' ' + @p
SET @m2 = @m2 + ' ' + @p

select @m1,@m2
结果如下:

UC-24C Cosmetic UC-24CI Cosmetic
下面的示例演示了如何使用以下各项完成此操作:

INSERT INTO XXX (Ref, Part, Description, Model)
SELECT Ref, Part, Description, 
Left(Model,CHARINDEX(' ', Model)) 
    + Right(Model,Len(Model)-CHARINDEX(' ', Model, CHARINDEX(' ', Model) +1)) 
FROM XXX;

UPDATE XXX SET 
Model = Right(Model,Len(Model)-CHARINDEX(' ', Model))
WHERE CHARINDEX(' ', Model, CHARINDEX(' ', Model) +1)<>0

如果Ref字段是自动主键,则不要在INSERT语句中包含该字段。

单个型号的编号始终为两个?是的。我将针对特定的模型进行修改。扩展数据是否总是一个单词且始终存在?换句话说,字段中是否总是有三个空格?如果是这样的话,我可以举一个在这个领域分裂的例子。扩展数据中可能有多个字。