2017-02-21 27 views
0

我希望@COLDEPARTMENTS里面有一列的结果。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

你需要一个tabled的值函数来将逗号分隔的列表转换为表格我已经完成了这样的工作 –

回答

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

这个分隔符就是你可以将它分隔的逗号或别的东西。 –