Вывод запроса "для явного XML" изменяет конечные нули для денежных столбцов в зависимости от соединения

У меня есть запрос Microsoft SQL Server, который создает временную таблицу, а затем выводит XML с использованием синтаксиса "для явного XML", например:

select * from @XMLOutput order by 
  [UaarSale!1!NodeOrder!hide], [UaarSale!1!NestingId!hide], Tag  
for XML Explicit

Это все содержится внутри хранимой процедуры. Мы просто запускаем хранимую процедуру, передавая наш идентификатор, чтобы получить документ XML.

Сам запрос работает отлично и уже несколько лет. Однако сейчас мы находим ситуации, когда вывод XML меняется в зависимости от того, кто вызывает хранимую процедуру. Наш вывод содержит большое количество типов данных money. В некоторых случаях конечные нули не включены в типы денег. В других случаях типы всегда показывают 4 значащих цифры.

В моей тестовой среде я продублировал это в базе данных SQL Server 2008 R2.

Например, моя основная программа (соединяющаяся со старым провайдером SQLOLEDB) получает XML, который не содержит конечных нулей.

<node value="12.34" />

Однако, когда я запускаю ту же хранимую процедуру из студии SQL Server Management, я всегда получаю 4 места.

<node value="12.3400" />

У меня также есть клиент, подключающийся к моему приложению с использованием того же поставщика SQLOLEDB, который получает дополнительные нули.

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

Существует ли такая вещь, и если да, то как я могу установить значение, чтобы мой вывод был согласованным? Желательно без лишних нулей.

1 ответ

Что я делаю, так это пользуюсь CONVERT(VARCHAR, xxx) чтобы обойти это.

Вот пример, протестированный в SQL Server 2008 R2:

DECLARE @foo MONEY
SELECT @foo = 15.95

SELECT @foo AS 'foo' FOR XML PATH('')
SELECT CONVERT(varchar, @foo) AS 'fee' FOR XML PATH('')
Другие вопросы по тегам