2016-05-25 73 views
0

我试图得到一个列值作为XML节点像这样:SQL FOR XML用于路径列值

FOR XML PATH(V_CONSTAT_ACTUAL_DATES.JOB_NUMBER), Type 

,但我得到这个错误:

Incorrect syntax near 'V_CONSTAT_ACTUAL_DATES'. Expecting STRING or TEXT_LEN

是什么,我想完成不可能?

以下是完整的SQL查询:

SELECT 
(
SELECT V_CONSTAT_ACTUAL_DATES.JOB_NUMBER AS 'Key', 
(
    SELECT 
     (


     SELECT 
     (

     SELECT 
     (

     SELECT 
     CONVERT(date, V_CONSTAT_ACTUAL_DATES.ID120) AS 'actualFinish', 
     CONVERT(date, V_CONSTAT_BASE_DATES.ID120) AS 'baseLineStart' 
     FOR XML PATH(''), Type 
     ) 
     FOR XML PATH('baseStartFinishList'), Type 
     ) 
     FOR XML PATH(''), Type 




), 

     (
     SELECT CONVERT(date, V_CONSTAT_ACTUAL_DATES.DATE_TO_END) AS 'closingDate' 
     FOR XML PATH(''), Type 
     ), 
     (
     SELECT DATEDIFF(dd,V_CONSTAT_BASE_DATES.ID67,V_CONSTAT_ACTUAL_DATES.DATE_TO_END)-1 AS 'DaysOfConstruction' 
     FOR XML PATH(''), Type 
     ), 
     (
     SELECT DATEDIFF(dd,GETDATE(),V_CONSTAT_ACTUAL_DATES.DATE_TO_END) AS 'DaysToClosing' 
     FOR XML PATH(''), Type 
     ), 
     (
      SELECT 
      IsNull(V_CONSTAT_ACTUAL_DATES.IDNOTES2, ' ') AS 'notes' 
      FOR XML PATH(''), Type 
     ), 
     (
     SELECT DATEDIFF(dd,V_CONSTAT_BASE_DATES.ID187,V_CONSTAT_PROJ_DATES.ID187) AS 'ScheduleVariance' 
     FOR XML PATH(''), Type 
     ) 
FOR XML PATH('V_CONSTAT_PROJ_DATES.JOB_NUMBER'), Type 
) 
FOR XML PATH('KeyValue'), Type 
) 
FROM 
      ((V_CONSTAT_PROJ_DATES V_CONSTAT_PROJ_DATES INNER JOIN V_CONSTAT_ACTUAL_DATES V_CONSTAT_ACTUAL_DATES 
     ON 
      V_CONSTAT_PROJ_DATES.JOB_NUMBER=V_CONSTAT_ACTUAL_DATES.JOB_NUMBER) 
     INNER JOIN 
      V_CONSTAT_BASE_DATES V_CONSTAT_BASE_DATES 
     ON 
      (V_CONSTAT_ACTUAL_DATES.JOB_NUMBER=V_CONSTAT_BASE_DATES.JOB_NUMBER) AND (V_CONSTAT_PROJ_DATES.JOB_NUMBER=V_CONSTAT_BASE_DATES.JOB_NUMBER)) 
     INNER JOIN 
      V_CONSTAT_SCH_DATES V_CONSTAT_SCH_DATES 
     ON 
      ((V_CONSTAT_BASE_DATES.JOB_NUMBER=V_CONSTAT_SCH_DATES.JOB_NUMBER) AND (V_CONSTAT_PROJ_DATES.JOB_NUMBER=V_CONSTAT_SCH_DATES.JOB_NUMBER)) 
      AND (V_CONSTAT_ACTUAL_DATES.JOB_NUMBER=V_CONSTAT_SCH_DATES.JOB_NUMBER) 



WHERE V_CONSTAT_ACTUAL_DATES.AREA_DESC = 'Fairgrounds Phase 5' AND V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() 

ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 
FOR XML PATH(''), ROOT('Root') 

我试图让JOB_NUMBER的列值作为节点名

这里是我当前XML的例子:

<KeyValue> 
    <Key>FA50104</Key> 
    <V_CONSTAT_PROJ_DATES.JOB_NUMBER> 
     <baseStartFinishList> 
     <baseLineStart>2016-06-06</baseLineStart> 
     </baseStartFinishList> 
     <closingDate>2016-05-26</closingDate> 
     <DaysOfConstruction>237</DaysOfConstruction> 
     <DaysToClosing>1</DaysToClosing> 
     <notes> </notes> 
     <ScheduleVariance>0</ScheduleVariance> 
    </V_CONSTAT_PROJ_DATES.JOB_NUMBER> 
    </KeyValue> 

我想要做的是将V_CONSTAT_PROJ_DATES.JOB_NUMBER作为关键值(FA50104)

+0

后整个代码 – TheGameiswar

+0

FOR XML PATH( 'V_CONSTAT_ACTUAL_DATES.JOB_NUMBER'), –

+1

类型的值内'PATH()'必须是一个**字符串文字** - 你不能指按名称的变量或列。该字符串文字定义XML输出中每行的最外层XML节点的**名称**。 –

回答

1

您需要'手动'创建外部元素。 简单的例子:

with t as (
select 
     1 as a, 2 as b, 3 as c, 4 as d, 'k100' as [key] 
) 
select [key], 
cast ('<'+ [key] + '>' + 
    cast(
    (select 
     (select a as g1, b as g2 for xml path ('grp'), type) 
     , (select c as g1, d as g2 for xml path ('grp'), type) 
    for xml path ('')) 
    as varchar(max)) 
    + '</'+ [key] + '>' 
as xml) xmlcol 
from t