2008-11-05 81 views
0

我正在处理一个应用程序,该应用程序从我们的数据库获取数据,并在生成的查询结尾使用FOR XML AUTO,ELEMENTS输出xml文件,然后输出XSLT以我们想要的方式改变它。然而,在我们使用sql标量函数生成某些数据的特定情况下,它总是将该元素放入与已存在的表节点名称相同的子表节点中(所以说它是表xyz,它会是print("<xyz><node1></node1><xyz><generated-node-from-function></generated-node-from-function></xyz>");SQL Server和xml自动生成元素

无论我尝试什么(甚至直接操纵应用程序生成的sql副本),它似乎总是会创建这个额外的节点层,这会在以后导致出现问题,当我们尝试处理此xml以提取数据有没有什么特殊的属性会导致sql server中的xml生成器以这种方式工作,并且有什么方法可以阻止它,所以我可以将生成的数据节点保留在与其关联的表的其余数据相同的级别上与?

编辑:重命名索引列/表在索姆电子病例,但其他应该是相同的SQL。

SELECT * FROM (SELECT column1,column2,column3,iduser,jstart,jstop,jbatchperiod,jinactive,processed,column4,lock,column5,batchticketmicr,machineid,sjobopex,szopexrefid,jreceived,jstartopex,jstopopex,idspecialmicr,idp2batchoriginal,stateflags,bcrossrefid,bidentifier1,bidentifier2,bidentifier3,bidentifier4,bidentifier5,idexport,idimport,rsahash FROM table1) table1 
    LEFT JOIN (SELECT column21,ienvelope,isort,column1,idtemplate,processed,column4,lock,envelopetypecode,szqueuesvisitedunique,exportdate,jcompleted,status,ipriority,idbankaccount,iprioritybeforerzbump,fstoredrecondata,cscountyid,column10,column11,checkbox1,checkbox2,column12,column13,column14,xxxempfein,column15,column16,originalenvelopeid,column17,column18,xxxoag,trackingnumber,csldc,ecrossrefid,postmark,routingflags,eidentifier1,eidentifier2,eidentifier3,eidentifier4,eidentifier5,idexport FROM envelope) envelope ON table1.column1=Envelope.column1 
    LEFT JOIN (SELECT column21,column22,isort,column23,processed,side,pagetypecode,rawmicrline,rawscanline,rawbarcode,exportid,szlocandconf,szlocandconfpagefields,idformtemplate,szparms,rawmarksense,audittrail,audittrailelectronic,pixheight,pixwidth,ocrattemptcounter,idspecialmicr,idpageexception,pagemodifierflags,column10,csldc,rejectdate,rejectuser,rejectqueue,fsupervisorreject,xxxempno,xxxtraceno,xxxemplcnt,checkbox1,keyword,templatealtered,templateflags,pidentifier1,pidentifier2,pidentifier3,pidentifier4,pidentifier5,isscanlinevalid,idexport,clickcount FROM Table2) Table2 ON Envelope.column21=Page.column21 
    LEFT JOIN (select column22, column21, dbo.Fileimagepath(column21, column22) as path from Table2) Fileimg ON Table2.column21=FileImg.column21 AND Table2.column22=FileImg.column22 
WHERE Envelope.column21 = 8 
FOR XML AUTO, ELEMENTS 

另一个编辑:基本上FileImg的成绩越来越裹在里面现有的表2标签与数据的其余部分额外的一套表2标签。

另一个编辑︰测试对另一个数据库与相同的SQL它正常工作,它似乎有一个坏的设置在我的数据库或存储的过程不同去调查更远

如果不工作,我会尝试上面的一些其他的建议,感谢您的帮助迄今为止:)

+0

您能否提供SQL语句,这样会更清楚。谢谢。而且:在你的问题中,XML是否是确切的XML?是否有一些缺失标签?你能检查一下吗? – splattne 2008-11-05 15:28:13

+0

当然,给我一秒来清理和取消它的业务。 – Runevault 2008-11-05 15:35:30

回答

0

做一些进一步reserach,截至目前它似乎运行在2000 compat模式的数据库,而在2005 sql服务器上创建此问题,不会钉这直到确认。

1

我想尝试摆脱子查询部分“的(SELECT ... “和做定期的加入,如:。

SELECT table1.column1, table1.column2, ..., envelope.column21, ... 
FROM table1 LEFT JOIN envelope on table1.column1 = envelope.column1 ... 
WHERE envelope.column21 = 8 
FOR XML AUTO, ELEMENTS 

为了更清楚我ommitted大部分的列和联接只需插入你需要的列,哪些是必要的njoins

是否能返回你的权利XML还是我错过了点?

+0

我可能很难解释这一点。这是很糟糕的唯一部分是dbo.FileImagePath(column21,column22)的回归结果,得到塞进命名为它的父表后(所以 PathHere Runevault 2008-11-05 16:16:36

1

我不能用我的一个函数来重现它(我试图按照与你相同的方式执行)。

但我有一个怀疑:是否有一个SELECT查询中的FileImagePath函数不用于最终结果?也许这会创造你正在经历的神器?

尝试插入

return 'test' 

的功能的第一行(如果你能做到这一点在你的开发数据库 - 或者,如果你正在使用的功能只有一个)。看看,如果行为改变。

1

查看FOR XML EXPLICIT - 它更复杂,但您可以根据需要定义结构。