2015-01-07 35 views
1

嗨,我們有一個遺留代碼,我們正試圖修改並試圖擺脫「for XML」。當前碼是如下xml刪除sql錯誤

Select 
      a.columnidfk   as columnid, 
      tvs.columnversion   as columnversion, 
      a.newcolumnId    as newcolumnid, 
       (Select 
        at.columnTrackingId  as columntrackingid, 
        at.newcolumnIdFk   as newcolumnid, 
        at.IDBSIdFk as idbid, 
        i.Name      as iname, 
        IsNull(convert(varchar,at.colidbdate,101),'')  as colidbdate, 
        IsNull(convert(varchar,at.colidbdate2,101),'') as colidbdate2, 
        IsNull(at.colReason, '')   as colReason, 
        IsNull(d.DispositionText, '')  as DispositionText, 
        at.status as status 
       From columnTracking at 
      Left Outer Join LkIDBs i on at.IDBSIdFk = i.IDBSId 
      left outer join LkDisposition d On at.[colDecisionIdFk] = d.DispositionId 
     Where at.status in('Active','Inactive') and at.newcolumnIdFk = a.newcolumnId and (i.status in ('Active','Inactive') OR i.status is null) and (d.status='Active' or d.status is null) 
     for Xml path('columntracking'), type) 
     From tablecolumns a    
     Left Outer Join columnVersions tvs on a.columnversionidfk = tvs.columnversionid Where 
     a.columnVersionIdFk in 
     (Select columnVersionId From columnVersions tv 
      Inner Join tabcolumns t On tv.colIdFk = t.colId 
      Where t.TicketNo = @TicketNo) 
     order by a.TicketVersionIdFk , a.assessmentid 
     For Xml path('columntab'), Root('columns') 

當我刪除 「用於XML路徑( 'columntracking'),式」 和「用於XML路徑( 'columntab'),根( '列') 「即時提示以下錯誤:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

請指教!

+0

XML的父節點和孩子,如果你刪除XML的路徑,你要輸出爲孩子什麼元素值,如錯誤所示,每個在columntab上會有多行。刪除xml路徑後面的用例是怎樣的? .. – radar

+0

'SELECT ... FOR XML PATH ...'產生一個XML格式的字符串,每行一個。刪除FOR XML,它會生成一個表。所以基本上你正試圖在一排中嵌套一張桌子!這是無效的。 –

+0

您的權利我需要列表格式而不是xml格式的列。我試圖將第一個xml輸出代碼放置在父代碼的左外連接中,但似乎會產生兩倍的no行數。有沒有其他辦法可以做到這一點? –

回答

0

我認爲我得到了想要的表了由加入的(第一個XML列放)

Select 
      a.columnidfk   as columnid, 
      tvs.columnversion   as columnversion, 
      a.newcolumnId    as newcolumnid, 
      att.columntrackingid, 
      att.newcolumnid, 
      att.idbid, 
      att.iname 

     From tablecolumns a    
     Left Outer Join columnVersions tvs on a.columnversionidfk = tvs.columnversionid Where 
     left outer join (
     Select 
        at.columnTrackingId  as columntrackingid, 
        at.newcolumnIdFk   as newcolumnid, 
        at.IDBSIdFk as idbid, 
        i.Name      as iname, 
        IsNull(convert(varchar,at.colidbdate,101),'')  as colidbdate, 
        IsNull(convert(varchar,at.colidbdate2,101),'') as colidbdate2, 
        IsNull(at.colReason, '')   as colReason, 
        IsNull(d.DispositionText, '')  as DispositionText, 
        at.status as status 
       From columnTracking at 
      Left Outer Join LkIDBs i on at.IDBSIdFk = i.IDBSId 
      left outer join LkDisposition d On at.[colDecisionIdFk] = d.DispositionId 
     Where at.status in('Active','Inactive') and (i.status in ('Active','Inactive') OR i.status is null) and (d.status='Active' or d.status is null) 
     ) att on att.newcolumnid = a.newcolumnId 
     and a.columnVersionIdFk in 
     (Select columnVersionId From columnVersions tv 
      Inner Join tabcolumns t On tv.colIdFk = t.colId 
      Where t.TicketNo = @TicketNo)