使用分隔符在T-SQL中拆分列,同时跳过分隔符

时间:2010-08-27 08:25:45

标签: sql sql-server-2005 tsql

好的问题标题含糊不清,但这就是问题所在。我在一个名为Files的表的第一列中有一个文件名列表,我想解析数据是下划线分隔的,但有时我想跳过下划线。每个文件名都采用以下形式:

distance1000_7_13_2010_1_13PM_AveryDennisonAD_2300008_10S_Lock.csv

因此,为了获取日期和时间,我想将此列拆分为以下形式:

Col_A = distance1000
Col_B = 7_13_2010
Col_C = 1_13PM
Col_D = AveryDennisonAD
Col_E = 2300008
Col_F = 10S
Col_G = Lock.csv

如果我可以将.csv从Col_G中删除,那也很好,尽管没有必要。这是我到目前为止的代码,其中没有正确解析日期和时间的Col_B和Col_C:

DECLARE @RowCount INT, @I INT
SET @RowCount = (SELECT COUNT(FileName) FROM Files)
SET @I = 1

WHILE (@I <= @RowCount)
BEGIN
        DECLARE @FileName VARCHAR(1000)  
        SELECT @FileName = FileName FROM Files WHERE FileID = @I
        UPDATE Files 
        SET Col_A = dbo.fnSplit(@FileName, '_', 1),
            Col_B = dbo.fnSplit(@FileName, '_', 2), 
            Col_C = dbo.fnSplit(@FileName, '_', 3), 
            Col_D = dbo.fnSplit(@FileName, '_', 4),
            Col_E = dbo.fnSplit(@FileName, '_', 5)
            --etc.etc.
        WHERE FileID = @I
        SET @I = @I  + 1
END

如何修改SET语句以便有时“跳过”分隔符(并将其包含在新的列数据中)并使用下划线分隔符在其他时间分割列?

我希望这很清楚。提前谢谢!

1 个答案:

答案 0 :(得分:1)

除非我遗漏了一些明显的东西,否则你不能将所需的元素连接到新的字段中吗?

在下面的示例中,我也删除了循环,因为它似乎没有必要 - 但是,如果没有fnSplit过程的某些细节,我无法肯定地说:

UPDATE Files 
SET Col_A = dbo.fnSplit(FileName, '_', 1),
    Col_B = dbo.fnSplit(FileName, '_', 2) 
        + '_' + dbo.fnSplit(FileName, '_', 3)
        + '_' + dbo.fnSplit(FileName, '_', 4),
    Col_C = dbo.fnSplit(FileName, '_', 5), 
    Col_D = dbo.fnSplit(FileName, '_', 6),
    Col_E = dbo.fnSplit(FileName, '_', 7)
etc

(从可用性的角度来看,为你的列使用更有意义的名称可能更好)