Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выгрузка в XML значений NULL  [new]
iNatty
Member

Откуда: С-Петербург
Сообщений: 54
MS SQL Server 2000

Добрый день! Прошу помощи, ибо 3 день бьюсь, и все без результата.

Есть запрос, расположенный внутри процедуры, который выгружает XML-файл. Файл создается, все хорошо. 2 вопроса
1. Как мне вывести значения NULL в теги типа
<STATUS/>
? (XSINIL уже другая версия)
2. Можно ли каким-то образом каждый тег расположить на отдельной строчке? Перепробовала все квалификаторы у bcp, но без -c или -w она дает ошибку, а -r при них игнорируется. На форуме нашла тему, пишут, что, невозможно, и не мешает чтению данных, но есть некая целевая аудитория, которая затем ручками в некоторые пустые теги пишет данные.

Все это помещено в хранимку, которая будет вызываться из клиентского приложения, поэтому очень хотелось бы сделать без дальнейшей "доработки" файлика.
27 фев 12, 11:59    [12155737]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
iNatty,

1. если тег или атрибут не заполнен это обычно и означает что значение равно null
2. в xml нету строк только теги и атрибуты, визульное представление удел клиентского приложения, следовательно там и нужно делать предобработку перед показыванием клиенту голого xml текста.
27 фев 12, 12:14    [12155862]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
iNatty
Member

Откуда: С-Петербург
Сообщений: 54
Проблема в том, что поля, значения которых NULL, просто теряются, и тегами не становятся. То ли я что-то по умолчанию не ставлю, но я уже все, что можно было, вроде бы, попробовала.
А клиентское приложение - они выгрузят этот файл и, максимум, что сделают, отправят по почте. А уже там требование - видеть построчно.
27 фев 12, 12:25    [12155971]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
iNatty
2. Можно ли каким-то образом каждый тег расположить на отдельной строчке?

Можно. Что-то типа такого:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:param name="indent-increment" select="'	'"/>
  <xsl:template match="node()">
    <xsl:param name="indent" select="'
'"/>
    <xsl:value-of select="$indent"/>
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates>
        <xsl:with-param name="indent" select="concat($indent,$indent-increment)"/>
      </xsl:apply-templates>
      <xsl:if test="*">
        <xsl:value-of select="$indent"/>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Скормите xml, полученный от bcp, и вышеприведенное в качестве шаблона XSLT-процессору. ЕМНИП, некоторые из коробки такое умеют, достаточно соответствующего флага обработки (xalan это что ли был? не помню уже).
27 фев 12, 12:27    [12155982]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
Пардон, движок форума опять сам преобразовал эскейпы. Вот:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:param name="indent-increment" select="'&#х9;'"/>
  <xsl:template match="node()">
    <xsl:param name="indent" select="'&#хD;&#хА;'"/>
    <xsl:value-of select="$indent"/>
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates>
        <xsl:with-param name="indent" select="concat($indent,$indent-increment)"/>
      </xsl:apply-templates>
      <xsl:if test="*">
        <xsl:value-of select="$indent"/>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
27 фев 12, 12:29    [12155999]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
iNatty
Member

Откуда: С-Петербург
Сообщений: 54
Сон Веры Павловны
Скормите xml, полученный от bcp, и вышеприведенное в качестве шаблона XSLT-процессору.

Упс, а это что я должна для этого сделать?
27 фев 12, 12:44    [12156142]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
тут_был_вася
Guest
может быть, что-нибудь типа
CAST(CASE WHEN field IS NULL THEN '<STATUS/'> ELSE '<STATUS>' + field + '</STATUS>' END AS XML) AS node()
?
27 фев 12, 20:07    [12160191]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
iNatty
Member

Откуда: С-Петербург
Сообщений: 54
Запрос идет вида
 EXEC ('SELECT  
   SCH.NOM
  ,SCH.DATA
  ,REC.VID
  ,REC.TIP
  ,REC.POL
  ,REC.STATUS
   ---... полей много
FROM SCH
INNER JOIN REC ON ... -- таблиц несколько 
WHERE ...
FOR XML AUTO, ELEMENTS')

Идут подстановки имени таблицы, и так далее, важно только то, что XML формируется через FOR XML AUTO, ELEMENTS, поэтому повлиять на выгрузку не могу.
27 фев 12, 21:22    [12160487]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Простите меня, но на это нельзя не смотреть без умиления.
Обожаю, когда из конфетки тяжело говнецо сделать.

iNatty, передайте привет тому идиоту, кто взял с потолка эти "требования" и заставил вас корячиться. Хотя вы сами себя подчиняете следовать данной глупости.
Кстати можете плац ломом подметать. Эффект будет похожим.

Сон Веры Павловны, а чем ваш скрипт лучше этого?:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
28 фев 12, 02:37    [12161227]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6203
Mnior
Сон Веры Павловны, а чем ваш скрипт лучше этого?

Тем, что опция indent="yes" в xsl:output даже по спецификации носит достаточно расплывчатый характер, описанный в основном через сослагательное наклонение:
If the indent attribute has the value yes, then the xml output method may output whitespace in addition to the whitespace in the result tree (possibly based on whitespace stripped from either the source document or the stylesheet) in order to indent the result nicely; if the indent attribute has the value no, it should not output any additional whitespace. The default value is no. The xml output method should use an algorithm to output additional whitespace that ensures that the result if whitespace were to be stripped from the output using the process described in [3.4 Whitespace Stripping] with the set of whitespace-preserving elements consisting of just xsl:text would be the same when additional whitespace is output as when additional whitespace is not output.

В общем, какие-то парсеры её просто не поддерживают, каким-то для работы этой опции нужна ссылка в PI на специфический неймспейс вендора, в котором это реализовано, и т.д. Проверил сейчас этот indent="yes" на том, что было под рукой (Gecko) - всё в одну строку.
28 фев 12, 03:51    [12161295]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Сон Веры Павловны
на том, что было под рукой (Gecko)
Понял вашу мысль, хотя утонув в M$ и не пользоваться тем что и так уже стоит.
28 фев 12, 10:48    [12161994]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
iNatty
Member

Откуда: С-Петербург
Сообщений: 54
Mnior
...следовать данной глупости.

А если не следовать? Через что сделать такую выгрузку? Через EXPLICIT?
Требования прежние - пустые теги и каждый тег на своей строке. Но напишу свой запрос. Время дали.
28 фев 12, 14:19    [12163734]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iNatty
Mnior
...следовать данной глупости.

А если не следовать? Через что сделать такую выгрузку? Через EXPLICIT?
Требования прежние - пустые теги и каждый тег на своей строке. Но напишу свой запрос. Время дали.
Перевожу ваши слова.
"Как следовать глупостям не следуя им".

Тэги, строки - это глупости. Решение с XSLT вам уже подсказали.

NULL как я понимаю на этом древнем SQL не обработать (или нет?). Поэтому выкидываете XML на скуле в топку и пишите запрос к скулю через SQLXML провайдер. Не знаю, но по идее сервер ему пофиг какой. Кста можете и параметры XML-я выставить и/или сразу XSLT применить.
А далее сами решайте через что, тулза своя, скрипты, PowerShell или тупой VB Scrpit, Extended Procedures и т.п. ...

Но не думаю что вы потянете.
28 фев 12, 19:15    [12166150]     Ответить | Цитировать Сообщить модератору
 Re: Выгрузка в XML значений NULL  [new]
iNatty
Member

Откуда: С-Петербург
Сообщений: 54
Mnior
Но не думаю что вы потянете.

Вполне возможно, вещь для меня новая. )

Спасибо большое всем откликнувшимся! По крайней мере, теперь понятно, что задача не так проста, как казалось мне на первый взгляд, и не достаточно всего лишь поставить нужный флажок.
2 мар 12, 20:00    [12186085]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить