SQL Server и генерирование xml с xml auto, элементы - PullRequest
0 голосов
/ 05 ноября 2008

Я работаю над приложением, которое берет данные из нашей БД и выводит xml-файл, используя FOR XML AUTO, ELEMENTS в конце сгенерированного запроса, а затем XSLT, чтобы преобразовать его так, как мы хотим. Однако в конкретном случае, когда мы генерируем некоторые данные с использованием скалярной функции sql, он всегда помещает этот элемент в узел вложенной таблицы с именем, совпадающим с узлом таблицы, в котором он уже находится (так что это будет таблица xyz, это будет print("<xyz><node1></node1><xyz><generated-node-from-function></generated-node-from-function></xyz>");

Независимо от того, что я пытаюсь (даже непосредственно манипулируя копией sql, сгенерированной приложением), всегда создается этот дополнительный слой узла, что вызывает проблемы позже, когда мы пытаемся обработать этот xml для извлечения данных позже. Есть ли какое-то конкретное свойство, заставляющее генератор xml на сервере sql работать таким образом, и есть ли способ предотвратить его, чтобы я мог сохранить сгенерированный узел данных на том же уровне, что и остальные данные для таблицы, с которой он связан?

Редактировать: в некоторых случаях переименовывать столбцы / таблицы, но в остальном должен быть такой же 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 помещаются в дополнительный набор тегов Table2 внутри существующей вкладки table2 с остальными данными.

Еще одно редактирование: при тестировании на другой базе данных с тем же sql все работало корректно, кажется, что в моей базе данных есть неверный параметр или сохраненный процесс отличается идет дальше, чтобы исследовать .

Если это не сработает, я попробую другие предложения, приведенные выше, спасибо за помощь:)

Ответы [ 4 ]

1 голос
/ 05 ноября 2008

Я не могу воспроизвести его с помощью одной из своих функций (я пытался сделать это так же, как вы).

Но у меня есть подозрение: есть ли в функции FileImagePath запрос SELECT, который не используется для окончательного результата? Может быть, это создает артефакт, который вы испытываете?

Попробуйте вставить

return 'test'

в качестве первой строки функции (если вы можете сделать это в своей базе данных разработки или если вы единственный, кто использует эту функцию) . И посмотрите, изменится ли поведение.

1 голос
/ 05 ноября 2008

Посмотрите на FOR XML EXPLICIT - это сложнее, но вы определяете структуру так, как хотите.

1 голос
/ 05 ноября 2008

Я бы попытался избавиться от частей подзапроса "(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 

Чтобы быть более ясным, я опустил большинство ваших столбцов и объединений. Просто вставьте нужные столбцы и необходимые соединения.

Возвращает ли это вам правильный XML или я упускаю суть?

0 голосов
/ 11 ноября 2008

Дальнейшее повторное исследование, так как на данный момент кажется, что он работает в режиме db в режиме Compat 2000, в то время как на сервере SQL 2005 года эта проблема создана, не будет зафиксировано до тех пор, пока не будет подтверждено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...