2016-06-22 1 views
1

Мы преобразовали базу данных с SQL Server 2000 на SQL Server 2014. Нам нужен вывод XML и использовать параметр for xml explicit T-SQL для возврата XML.Различные значения, возвращаемые SQL Server 2000 и SQL Server 2014 при возврате результатов, используя для явного выражения xml

Величина метки сохраняется во время преобразования. т. е. обычный запрос возвращает значение метки времени 0x00000000057A12B8 на обоих серверах.

При использовании для XML явного SQL Server 2014 вывод <Ts>AAAAAAV6Erg=</Ts> и 2000 выходом SQL Sever является <Ts>91886264</Ts>

Может кто-нибудь объяснить разницу?

ответ

1

Прежде всего : Поздравления! Вы будете счастливы без SQL Server 2000!

Второй: SELECT ... FOR XML EXPLICIT устарел и должен быть (почти во всех случаях) заменен на звонки SELECT ... FOR XML PATH('xyz'). Это дает вам гораздо лучший контроль и очень интуитивный подход.

Теперь на ваш вопрос:

, как вы, конечно, сейчас, TIMESTAMP это - кроме ANSI-SQL, где он является тем же Т-SQL, DATETIME - это двоичного типа, лучше использовать с синонимом ROWVERSION чтобы избежать путаницы.

SQL Server 2014 будет неявно преобразовывать двоичные данные в base64, чтобы включить это в XML (на основе текста).

Попробуйте это:

DECLARE @varBin VARBINARY(MAX)=0x00000000057A12B8; 
DECLARE @asXML XML= (SELECT @varBin FOR XML PATH('xyz')); 

SELECT @asXML; 
--result: <xyz>AAAAAAV6Erg=</xyz> 

--re-read the value 
SELECT @asXML.value('/xyz[1]','varbinary(max)') 
--result: 0x00000000057A12B8 

Числовое значение, которое вы получили только десятичное число, чтобы выразить то же самое значение:

HEX 57A12B8 
DEC 91.886.264 
BIN 0101 0111 1010 0001 0010 1011 1000 

С этим запросом

SELECT CAST(@varBin AS BIGINT) 

вам получит номер - если вам это нужно ...

+1

Большое спасибо за подробный ответ и примеры. Наше приложение использовало SELECT ... FOR XML EXPLICIT в дни версии .NET Framework 1.0 (или около того), когда классы DataSet и ADO.NET не предлагали нам большую помощь при составлении карт O/R. С тех пор мы смотрели и флиртовали с различными версиями Entity Framework с интересом, но без этого достаточно убедительно, чтобы использовать его. Однако, с переходом на SQL Server 2014, возможно, мы найдем EF7 подходящим. Тем не менее, мне нравится XML, хотя я чувствую себя немного старомодным, говоря это. Я согласен с вашим комментарием о SELECT .. FOR XML PATH ('xyz'). –

+1

В конечном итоге мне удалось вставить грубую прокладку и использовать Convert.FromBase64String() для получения байтового массива и BitConverter.ToUInt64(), чтобы получить данные в том же виде, что и старый XML-сервер SQL Server 2000 –

3

значения Timestamp в SQL Server 2005 сериализации в base64 закодированных двоичных значений вместо представления чисел в SQL Server 2000, вы можете обратиться в этом link для всех изменений, внесенных в течение XML в SQL сервере 2005

+0

Thx за ссылку, еще не знаю ... стоит upvote ... – Shnugo

+1

Отличный ответ и очень ценится. Ссылка на «Что нового в FOR XML в Microsoft SQL Server 2005» кратко объясняет проблему. Хотя, довольно смущающе, я не нашел нужным, когда искал изменения в SQL Server 2014. –

Смежные вопросы