Вывод запроса "для явного 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('')