2015-11-04 3 views
-2

У меня небольшая проблема с SQL Server.SQL Server разделяет строку, содержащую запятые

У меня есть колонка под названием "versionslist".

Это versionslist может содержать что-то вроде этого ->

'PVW3.50,UtP7.30,NTE8.39' 

Теперь я хочу, чтобы получить PVW3.50 and Utp7.30 and NTE8.39 отделенный, но я не знаю, как я могу сказать, что SQL Server запятая ',' является разделителем и что она раскололась разные версии.

Спасибо за помощь!

ответ

0

Вы также можете достичь этого, создав пользовательскую функцию.

Функция: fn_Split

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ') 
RETURNS @Strings TABLE 
( 
    position int IDENTITY PRIMARY KEY, 
    value varchar(8000) 
) 
AS 
BEGIN 

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
    BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
     BEGIN 
     INSERT INTO @Strings VALUES (@text) 
      BREAK 
     END 
    IF (@index > 1) 
     BEGIN 
     INSERT INTO @Strings VALUES (LEFT(@text, @index - 1)) 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
     END 
    ELSE 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END 
    RETURN 
END 

Затем,

DECLARE @versions AS VARCHAR(MAX) = 'PVW3.50,UtP7.30,NTE8.39' 

SELECT Value AS Versions FROM fn_Split(@versions,','); 

Выходной

+----------+ 
| Versions | 
+----------+ 
| PVW3.50 | 
| UtP7.30 | 
| NTE8.39 | 
+----------+ 
2

Старый стандарт xml решение:

SELECT Split.a.value('.', 'NVARCHAR(max)') AS ID 
FROM (SELECT CAST ('<M>' + REPLACE(@List, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A 
CROSS APPLY Data.nodes('/M') AS Split (a) 

Здесь @List ваш список, разделенный запятыми.

+0

Есть ли способ, что я могу сделать это без использования какой-либо другой язык? Я буду использовать это в Navision, и каждый другой язык нуждается в другом интерфейсе, который делает эти вещи все более и более сложными – luke

+0

@ luke, другой способ находится в ответе Улласа. –

0

Вы можете сделать ярлык, используя coalesce, чтобы объединить ряд строк из записи в таблице, например.

declare @aa varchar (200) 
set @aa = '' 

select @aa = 
    coalesce (case when @aa = '' 
        then CarName 
        else @aa + ',' + CarName 
       end 
       ,'') 
    from Cars 

print @aa 
+0

Вы можете указать свое имя вместо «CarName». –

+0

Он хочет наоборот. –

+0

Я думаю, что это очень хорошо, если он берет значение как есть, а затем отдельно разделяет его требования. –

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