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

时间:2013-10-14 18:22:58

标签: 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-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

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

3 个答案:

答案 0 :(得分:1)

此解决方案仅在Model值具有以下模式Model1_Model2_SomethingElse时才有效,其中_ =空格(分隔符)且模型[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

答案 1 :(得分:1)

这里有一小段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

答案 2 :(得分:0)

以下SQL Fiddle示例演示了如何通过以下方式完成此操作:

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语句中不包含该字段。