2011-06-15 34 views
1
DECLARE @x varchar(250), @xx xml 

的月列表。如果我在我的SP部門ID的傳入的名單看起來是這樣的:存儲過程接收逗號月表ID要檢索逗號解碼值

set @x = '3, 9, 10, 12, 14' 

我可以很容易地將其轉換成XML和查詢它是這樣的:

set @xx = '<xml><e>' + REPLACE(@x,', ','</e><e>') + '</e></xml>' 

select @xx 

返回:

<xml><e>3</e><e>9</e><e>10</e><e>12</e><e>14</e></xml> 

而且

select @xx.query('for $d in /xml/e return data($d)') 

返回:

3 9 10 12 14 

使用XML路徑我可以手動獲得逗號分隔的部門名稱的列表,當我知道前手的DeptIDs

select SUBSTRING((SELECT (', '+DeptName) from vDepartments where DeptID in (3, 9, 10, 12, 14) for xml path('')), 3, 1000) 

但是,我認爲我應該能夠從上面的XML做到這一點:

select SUBSTRING((SELECT (', '+DeptName) from vDepartments where DeptID in @xx.query('for $d in /xml/e return string($d)') for xml path('')), 3, 1000) 
+0

什麼是錯誤?你已經傳達了你想要做的事情......但是當你嘗試時不會發生什麼。 – RThomas 2011-06-16 04:15:51

回答

0

我會把ID的從參數表中的變量和使用,在一個加入反對vDepartment

-- Comma separated parameter 
declare @x varchar(250) 
set @x = '3, 9, 10, 12, 14' 

-- Convert to xml 
declare @xx xml 
set @xx = '<xml><e>' + REPLACE(@x,', ','</e><e>') + '</e></xml>' 

-- Table variable to hold ID's from parameter 
declare @T table(ID int) 

-- Get ID's from xml 
insert into @T (ID) 
select N.value('.', 'int') 
from @xx.nodes('xml/e') as T(N) 

-- Use the table in a inner join. 
select stuff(
(select ', '+DeptName 
from vDepartments as D 
    inner join @T as T 
    on D.DeptID = T.ID 
for xml path(''), type).value('.', 'varchar(max)'), 1, 2, '') 

如果使用.value提取部門的逗號分隔的列表,你將不得不與<>&'"中沒有麻煩部門名稱。

編輯1

使用遞歸CTE獲取的ID,而不是轉換爲XML一個版本。全部在一個查詢中。

;with cte(ID, Rest) as 
(
    select cast(left(@x, charindex(',', @x+',')-1) as int), 
     stuff(@x, 1, charindex(',', @x+','), '')+',' 
    where len(@x) > 0  
    union all 
    select cast(left(Rest, charindex(',', Rest)-1) as int), 
     stuff(Rest, 1, charindex(',', Rest), '') 
    from cte 
    where len(Rest) > 1 
) 
select stuff(
(select ', '+DeptName 
from vDepartments as D 
    inner join cte as T 
    on D.DeptID = T.ID 
for xml path(''), type).value('.', 'varchar(max)'), 1, 2, '') 
+0

正是我需要的感謝 – BermudaLamb 2011-06-20 13:45:10