SQL Server и сгенерированный xml с xml auto, elements

Я работаю над приложением, которое берет данные из нашей БД и выводит 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, он работал правильно, похоже, что в моей базе данных плохая настройка или сохраненная процедура отличается идет дальше исследовать.

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

Не могли бы вы предоставить инструкцию SQL, чтобы было понятнее. Спасибо. И: является ли этот XML в вашем вопросе точным XML? Есть ли какие-то отсутствующие теги? Не могли бы вы это проверить?

splattne 05.11.2008 18:28

Конечно, дайте мне одну секунду, чтобы навести порядок и отменить бизнес.

Runevault 05.11.2008 18:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
2 406
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

Я, наверное, плохо это объясняю. ЕДИНСТВЕННАЯ плохая часть - это результаты возврата dbo.FileImagePath (column21, column22), которые помещаются в подузел, названный в честь его родительской таблицы (так что <Table2><otherdata></otherdata><Table2> <FileImagePath> PathHe‌ Re </FileImagePath> </ ‌ Table2> </Table2>

Runevault 05.11.2008 19:16

О, теперь я понимаю ... извините.

splattne 05.11.2008 19:28

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

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

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

return 'test'

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

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

Runevault 05.11.2008 19:51

Боже мой. Желаю тебе удачи! Если вы найдете конфигурацию или причину, сообщите нам! Теперь мне любопытно!

splattne 05.11.2008 20:09

О, я отправлю это как ответ, если никто не сделает это первым, просто чтобы правильный ответ был доступен для всех, кто ищет ту же проблему. Разделите богатство и все такое ^ _ ^

Runevault 05.11.2008 20:34

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

Ответ принят как подходящий

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

Другие вопросы по теме