2012-09-26 264 views
1

我需要在sql服務器中拆分字符串並將數據插入到表中。 Te字符串是固定長度,不用逗號分隔。在字符串我可以有1個或更多的記錄插入,例如:拆分固定長度的字符串

ID = 2個字符 名稱= 4個字符

字符串:01AAAA02BBBB03CCCC

在本例中,有3條記錄插入(我可以在字符串中只有一條記錄或更多)

ID名稱 01 AAAA 02 BBBB 03 CCCC

我需要一種方法來將這些信息分成兩個不同的列和三個不同的行。我正在考慮使用BCP實用程序,但我不確定,也許我需要拆分並生成一個文件,然後使用BCP。

有什麼想法?

+0

如果字符串的長度是固定的,怎麼能有一個或多個記錄?它是否填充空格?什麼是字符串長度? – RedFilter

回答

2

以下將處理超過3個id /名稱對。但請注意,沒有錯誤檢查。我把它留給你。

DECLARE @Input NVARCHAR(18) 
SET @Input = '01AAAA02BBBB03CCCC' 

DECLARE @Data TABLE 
(
    [Id] NCHAR(2), 
    [Name] NCHAR(4) 
) 

WHILE LEN(@Input) > 0 
BEGIN 

    DECLARE @CurrentData NCHAR(6) 
    SET @CurrentData = LEFT(@Input, 6) 

    DECLARE @CurrentId NCHAR(2) 
    SET @CurrentId = LEFT(@CurrentData, 2) 

    DECLARE @CurrentName NCHAR(4) 
    SET @CurrentName = RIGHT(@CurrentData, 4) 

    INSERT INTO @Data 
    (
     [Id], 
     [Name] 
    ) 
    SELECT 
     @CurrentId, 
     @CurrentName 

    SET @Input = RIGHT(@Input, LEN(@Input) - 6) 

END 

SELECT 
    [Id], 
    [Name] 
FROM 
    @Data 
+0

HI seth花,我喜歡這個想法,我創建了一個帶有字符串列表的查詢,如果我需要應用您的解決方案,我是否應該創建一個函數並調用每行的函數並執行插入操作?或者有另一種方式直接做到這一點?謝謝 – rgx71

+0

這取決於情況,不知道更多關於它的情況,我很難說。如果需要從數據庫中的多個位置拆分數據,則可以創建一個函數來返回表變量。然後,您可以使用表變量中的數據,但您認爲合適。 –

+0

我打算爲之前的代碼構建一個sp,非常感謝你們所有人!!!!! – rgx71

4

由於字符串長度是固定的始終,那麼你可以這樣做:

DECLARE @s VARCHAR(50) = '01AAAA02BBBB03CCCC'; 

SELECT * 
FROM 
(
    SELECT SUBSTRING(@s, 01, 2) AS ID, SUBSTRING(@s, 3, 4) AS Name 
    UNION ALL 
    SELECT SUBSTRING(@s, 7, 2) AS ID, SUBSTRING(@s, 9, 4) AS Name 
    UNION ALL 
    SELECT SUBSTRING(@s, 13, 2) AS ID, SUBSTRING(@s, 15, 4) AS Name 
) t; 

這會給你:

ID Name 
01 AAAA 
02 BBBB 
03 CCCC 

更新:如果你想從這個字符串一張桌子,你可以這樣做:

DECLARE @t table(name varchar(50)); 
INSERT INTO @t VALUES 
('01AAAA02BBBB03CCCC'), 
('01DDDD02BBBB03CCCC'), 
('01HHHH02QQQQ03CCCC'), 
('01IIII02MMMM03CCCC'); 

SELECT * 
FROM 
(
    SELECT SUBSTRING(name, 1, 2) AS ID, SUBSTRING(name, 3, 4) AS Name 
    FROM @t 
    UNION ALL 
    SELECT SUBSTRING(name, 7, 2) AS ID, SUBSTRING(name, 9, 4) AS Name 
    FROM @t 
    UNION ALL 
    SELECT SUBSTRING(name, 13, 2) AS ID, SUBSTRING(name, 15, 4) AS Name 
    FROM @t 
) t; 

這會得到Ë您以下:

ID Name 
01 AAAA 
01 DDDD 
01 HHHH 
01 IIII 
02 BBBB 
02 BBBB 
02 QQQQ 
02 MMMM 
03 CCCC 
03 CCCC 
03 CCCC 
03 CCCC 
+0

好的,謝謝!我不敢恭維,但從真正的查詢中獲取專欄怎麼樣?另外,我不知道在字符串 – rgx71

+0

@ rgx71中有多少條記錄您可以從表中的列名替換'@ s',查看我的編輯。我更新了我的答案,告訴你如何做到這一點。 –

+0

謝謝Mahmoud! – rgx71

相關問題