2017-02-01 6 views
0

У меня есть строка чисел, разделенная запятой. Образец: 123, 213, 312, 231 И мне нужно обработать каждое число в курсоре SQL. Итак, мой первый шаг, чтобы положить каждый номер в таблице следующим образом:Строка SQL, разделенная запятой в таблицу

DECLARE @t AS TABLE(string nvarchar(100)); 

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

ПРИМЕЧАНИЕ. Я использую SQL Server 2012, но будет хорошо, если функция также поддерживает SQL Server 2008 R2.

ответ

3

rextester: http://rextester.com/ZCU48506

функции: Jeff Moden в Split N4k

create function dbo.DelimitedSplitN4K (
    @pString nvarchar(4000) 
    , @pDelimiter nchar(1) 
) 
returns table with schemabinding as 
return 
    with e1(n) as (
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all select 1 
) 
    , e2(n) as (select 1 from e1 a, e1 b) 
    , e4(n) as (select 1 from e2 a, e2 b) 
    , cteTally(n) as (select top (isnull(datalength(@pString)/2,0)) 
     row_number() over (order by (select null)) from e4) 
    , cteStart(n1) as (select 1 union all 
     select t.n+1 from cteTally t where substring(@pString,t.n,1) = @pDelimiter) 
    , cteLen(n1,l1) as(select s.n1 
    , isnull(nullif(charindex(@pDelimiter,@pString,s.n1),0)-s.n1,4000) 
    from cteStart s 
) 
select ItemNumber = row_number() over(order by l.n1) 
     , Item  = substring(@pString, l.n1, l.l1) 
    from cteLen l; 
go 

запроса:

declare @sample nvarchar (64) = '123,213,312,231' 

select * from dbo.DelimitedSplitN4K(@sample,',') 

результаты

+------------+------+ 
| ItemNumber | Item | 
+------------+------+ 
|   1 | 123 | 
|   2 | 213 | 
|   3 | 312 | 
|   4 | 231 | 
+------------+------+ 

расщепления строки ссылки:

+0

Ничего себе это выглядит потрясающе. Большое спасибо за ссылку на этот инструмент! Отметьте как ответ –

0

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

Во-первых, создать функцию:

CREATE FUNCTION stringDilimitedToTableXML 
( 
    @str VARCHAR(4000), 
    @delimiter nchar(1) 
) 
RETURNS @Result TABLE(Value BIGINT) 
AS 
BEGIN 

    Declare @x XML 
    select @x = cast('<A>' + replace(@str,@delimiter,'</A><A>') + '</A>' as xml) 

    INSERT INTO @Result 
     SELECT t.value('.', 'int') as inVal 
     FROM @x.nodes('/A') as x(t) 

    RETURN 

END 
GO 

Вызовите функцию по запросу:

DECLARE @str VARCHAR(4000) = '2879,2880,2881,2892,2893,2894' 

SELECT * FROM dbo.stringDilimitedToTableXML(@str, ',') 

Результаты:

Value 
-------------------- 
2879 
2880 
2881 
2892 
2893 
2894 

(6 row(s) affected) 

Ссылка: https://blogs.msdn.microsoft.com/amitjet/2009/12/11/convert-comma-separated-string-to-table-4-different-approaches/