TSQL принимает правильное значение от каждого значения, разделенного запятыми - PullRequest
2 голосов
/ 15 августа 2011

12344-23s2 $ 4

У меня есть значение, которое я получаю из фида

12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7

все вышеуказанные значения разделены запятой.

Для каждого значения, разделенного запятыми, мне нужно взять только правильную часть после - (дефис)

Я пытался использовать приведенное ниже утверждение

right(ID, len(ID) - CHARINDEX('-', ID))

Если у меня есть только одно значение, я получаю правильное значение, т. Е. 23s2 $ 4. но если у меня несколько значений, разделенных запятыми, я получу все значения после первого -.

Я хочу взять каждое значение, разделенное запятой, и из этого каждого значения я хочу взять только правильную часть (после дефиса)

Ответы [ 4 ]

1 голос
/ 15 августа 2011

Обычно, когда вы пытаетесь сделать что-то подобное, вы должны создать UDF, который позволяет разбивать строку на основе разделителя.Эта статья посвящена довольно хорошей теме:

http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

Вы также можете рассмотреть использование некоторых функций XML для этого:

Declare @xml as xml,@str as varchar(100),@delimiter as varchar(10)
SET @str='12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7'
SET @delimiter =','
SET @xml = cast(('<X>'+replace(@str,@delimiter ,'</X><X>')+'</X>') as xml)
SELECT right(N.value('.', 'varchar(16)'), len(N.value('.', 'varchar(16)')) - CHARINDEX('-', N.value('.', 'varchar(16)'))) as value FROM @xml.nodes('X') as T(N)
1 голос
/ 15 августа 2011

Если вы импортируете это с помощью SQLBulkCopy, BULK INSERT или bcp, вы можете разделить CSV на отдельные столбцы во время импорта.Тогда ваш SQL работает для каждого столбца.

Если вы не можете этого сделать, то разбейте (см. Здесь: Разделите эквивалент функции в T-SQL? ) значение на строки.

Теперь вы отделили CSV (в виде строк или столбцов), используя либо

  • ваш ПРАВЫЙ код выше
  • , если ведущее значение всегда 12344, тогда используйте REPLACE (MyValue, '12344-', '')
1 голос
/ 15 августа 2011

Вам нужно будет сделать это в рамках сохраненного процесса. В хранимой процедуре вам нужно будет создать цикл while и проходить по полю, пока вы не обработаете все запятые.

1 голос
/ 15 августа 2011

Итак, вы решили проблему для одного значения - это хороший шаг.Теперь составьте список отдельных значений.Один из способов - превратить его в стол.Вот функция, которую я использовал, которая превращает разделенную запятыми строку в таблицу:

CREATE Function [dbo].[ParseStringList]  (@StringArray nvarchar(max) )  
Returns @tbl_string Table  (ParsedString nvarchar(max))  As  

BEGIN 

DECLARE @end Int,
        @start Int

SET @stringArray =  @StringArray + ',' 
SET @start=1
SET @end=1

WHILE @end<Len(@StringArray)
    BEGIN
        SET @end = CharIndex(',', @StringArray, @end)
        INSERT INTO @tbl_string 
            SELECT
                Substring(@StringArray, @start, @end-@start)

        SET @start=@end+1
        SET @end = @end+1
    END

RETURN
END

Затем вы выбираете из таблицы вот так:

Select ParsedString From dbo.ParseStringList(@StringArray)

Итак, отсюда,Вы можете применить свое решение:

Select right(ParsedString, len(ParsedString) - CHARINDEX('-', ParsedString))
From dbo.ParseStringList(@StringArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...