2017-02-21 2 views
0

Я хотел бы иметь результаты @COLDEPARTMENTS внутри таблицы с одной колонкой.Результат из XML_PATH внутри таблицы

Переменная @COLDEPARTMENTS берется из этого запроса:

DECLARE @COLDEPARTMENTS NVARCHAR(MAX) 
    SELECT @COLDEPARTMENTS = STUFF((SELECT ',' + QUOTENAME(DEPA_KEY, '[') FROM @DEPARTMENTS_TBL FOR XML PATH('')), 1, 1, '') 
       select @COLDEPARTMENTS 

, который дает мне результаты, как это:

[120000003],[120000002],[140000001],[120000005],[120000021],[120000025] 

То, что я хотел бы иметь теперь таблицу с одним столбцом с именем COLUMN_NAME с все эти результаты внутри. Это возможно?

+1

Да, это возможно. В общем, хранение списков вещей в разделительных строках - очень плохая идея. –

+0

@GordonLinoff - есть ли у вас ссылка или пример? Спасибо за ответ. – FrenkyB

+0

Вам нужна функция с табличными значениями для преобразования списка, разделенного запятыми, в таблицу, которую я сделал примерно так: –

ответ

1
create function [dbo].[udf_splitstring] (@tokens varchar(max), 
             @delimiter varchar(5)) 
returns @split table (
    token varchar(200) not null) 
as 
    begin 
     declare @list xml 

     select @list = cast('<a>' 
          + replace(@tokens, @delimiter, '</a><a>') 
          + '</a>' as xml) 

     insert into @split 
        (token) 
     select ltrim(t.value('.', 'varchar(200)')) as data 
     from @list.nodes('/a') as x(t) 

     return 
    end 

select * from udf_splitstring('[120000003],[120000002],[140000001],[120000005][120000021],[120000025]',',') 

выход

[120000003] 
    [120000002] 
    [140000001] 
    [120000005] 
    [120000021] 
    [120000025] 
1
 Create FUNCTION [dbo].[SplitStrings] 
       (
        @List NVARCHAR(MAX), 
        @Delimiter NVARCHAR(255) 
       ) 
       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), 
         E42(N)  AS (SELECT 1 FROM E4 a, E2 b), 
         cteTally(N) AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@List,1))) 
             ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42), 
         cteStart(N1) AS (SELECT t.N+1 FROM cteTally t 
             WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0)) 
        SELECT Item = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter,@List,s.N1),0)-s.N1,8000)) 
      FROM cteStart s; 

, а затем использовать его как этот

 select * from [dbo].[SplitStrings] ('1,2,3,4',',') 
+0

Демиметр - это то, что вы можете пробить, оно может быть разделено запятой или чем-то еще. –

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