2013-12-26 2 views
0

У меня есть VarChar строковое значение, как этотВставить запятую в varchar в несколько столбцов?

"AccountType","contains","Customer","Balance","equals",250,"FirstName","like","John"

Теперь я хочу, чтобы вставить этот

В таблице, как этот

FieldName  FieldContiion FieldValue 

    AccountType  contains  Customer 
    Balance   equals   250 
    FirstName  like   John 

Длина строковой переменной может быть изменение как это

"Balance","equals",250,"FirstName","like","John"
это означает, что он вставляет только две строки в таблицу.

+0

Извините @ ling.s в моем случае есть три поля в таблице, и я не могу принять постоянное значение. – Shamim

+1

Создайте хранимую процедуру, чтобы использовать следующую команду, чтобы разбить строку и вставить ее в таблицу. http://stackoverflow.com/questions/702968/how-do-i-expand-comma-separated-values-into-separate-rows-using-sql-server-2005 – SteveB

ответ

1

Вы можете сделать следующие шаги:

1) Разбить функцию для вашей разделенных запятыми строку:

CREATE FUNCTION [dbo].[Split] (
    @InputString     VARCHAR(8000), 
    @Delimiter     VARCHAR(50) 
) 

RETURNS @Items TABLE (
    Item       VARCHAR(8000) 
) 

AS 
BEGIN 
    IF @Delimiter = ' ' 
    BEGIN 
      SET @Delimiter = ',' 
      SET @InputString = REPLACE(@InputString, ' ', @Delimiter) 
    END 

    IF (@Delimiter IS NULL OR @Delimiter = '') 
     SET @Delimiter = ',' 

    DECLARE @Item     VARCHAR(8000) 
    DECLARE @ItemList  VARCHAR(8000) 
    DECLARE @DelimIndex  INT 

    SET @ItemList = @InputString 
    SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0) 
    WHILE (@DelimIndex != 0) 
    BEGIN 
      SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex) 
      INSERT INTO @Items VALUES (@Item) 

      SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)[email protected]) 
      SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0) 
    END 

    IF @Item IS NOT NULL 
    BEGIN 
      SET @Item = @ItemList 
      INSERT INTO @Items VALUES (@Item) 
    END 

    ELSE INSERT INTO @Items VALUES (@InputString) 

    RETURN 

END 

2) Создать процедуру, которая принимает в качестве параметра, разделенных запятыми. В этом примере я использую вашу фиксированную строку, но вы должны изменить ее, чтобы заставить ее работать с параметром. Примечание: Я принимаю во внимание, что таблица назначения всегда имеет 3 столбца и что строка, разделенная запятыми, имеет длину, равную 3 всегда. Вы должны адаптировать процедуру, если это изменение ...

/* Get the length of the comma separated string */ 
DECLARE @ITEM_COUNT INT 

SELECT @ITEM_COUNT = COUNT(*) FROM 
(
    SELECT item 
     FROM Split('"AccountType","contains","Customer","Balance","equals",250,"FirstName","like","John"',',') 
) N 

declare @x int 
set @x = 1 

/* Insert in your table every 3 columns... */ 
WHILE (@x < @ITEM_COUNT) 
BEGIN 

    insert into test 
    select /* pivoting the sub-query */ 
     fieldname = max(case when seq = @x then item end), 
     fieldcondition = max(case when seq = @x + 1 then item end), 
     fieldvalue = max(case when seq = @x + 2 then item end) 
    from 
    (
     SELECT item 
       ,row_number() OVER (ORDER BY (SELECT 1)) AS seq 
       FROM Split('"AccountType","contains","Customer","Balance","equals",250,"FirstName","like","John"',',') 
    ) a 

set @x = @x + 3 

END 

Надеется, что это помогает

+0

Но одна вещь дает проблему здесь. Выход не выполняется последовательно. Например, когда я поставил «ACCOUNTNAME», «содержит», «ПРТ», «ВидСчета», «содержит», «Клиент» Результат не в последовательности «AccountName» \t «AccountType» \t «содержит» "содержит" \t "Клиент" \t "ort" – Shamim

+0

Да, я допустил ошибку, когда заказал результирующий набор внутреннего запроса. Решение состоит в том, чтобы игнорировать предложение ORDER BY с помощью «SELECT 1». Я обновил его – Javier

0

Разбить строку по разделителю (, в вашем случае), а затем перебрать массив подстрок и вставить в таблицу. Ваш код будет что-то вроде следующего:

array subStrings[] = string.split(","); 
int i=0; 
while(i<len(subStrings)){ 
    // create query using the ith, (i+1)th and (i+2)th elements of the array 
i=i+3; 
} 

одно предположение в коде выше, что основная строка будет иметь элементы кратные только 3.

Смежные вопросы