2017-02-21 10 views
0

@COLDEPARTMENTSの結果を1つの列のテーブルに入れたいと考えています。私を与えているテーブル内のXML_PATHからの結果

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という名前の列を持つテーブルです

変数@COLDEPARTMENTSがこのクエリから取得されます内部のすべての結果。これは可能ですか?その後、

+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

区切り文字はカンマ区切りまたは別のものにすることができます。 –

関連する問題