Недавно мне был назначен проект бывшего коллеги, в котором синхронизация данных инвентаризации SAP с использованием SQL Server в качестве бэкэнда через Интернет. Часть его включает в себя создание файлов XML - и вот где моя дилемма.Использование ROW_NUMBER с ключом nvarchar
В структуре XML я должен следовать каждый элемент инвентаризации содержится в Message
элемента с числовым идентификатором, вроде как это:
<Messages>
<Message>
<MessageID>1</MessageID>
<first item />
</Message>
<Message>
<MessageID>2</MessageID>
<second item />
</Message>
</Messages>
Поле MessageID
служит в качестве номера строки: он увеличивает от 1 к числу строк в наборе результатов. Проблема заключается в том, первичный ключ таблицы является nvarchar
но ROW_NUMBER() OVER(ORDER BY)
требует bigint
ключа, поэтому следующий код:
SELECT
ROW_NUMBER() OVER(ORDER BY items.ItemCode) MessageID,
items.ItemCode as SKU
FROM OITM items
FOR XML PATH('Message'), ROOT('Messages')
терпит неудачу с
Ошибка преобразования типа VARCHAR данных в цифровой
Литейно ItemCode
до bigint
невозможно, так как ключ содержит нечисловые символы почти во всех строках. В таблице нет других ключевых полей, и добавление одного вручную невозможно, поскольку:
- В таблице 5500+ строк.
- SAP не поддерживает, чтобы его таблицы подвергались
UPDATE
на SQL-сервере и блокировали базу данных, если она обнаруживает несогласованность.
Я не могу изменить структуру XML, потому что тогда API с другой стороны не примет его.
Так что мой вопрос: есть ли способ использовать ROW_NUMBER()
с ключом nvarchar
? Или альтернатива ROW_NUMBER()
, которая работает с нечисловыми клавишами?
Я только что пробовал свой код и не имею проблем с созданием требуемого XML, что дает вам сообщение об ошибке. Добавление некоторых выборочных данных тоже поможет. –
Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что пользователь задает вопрос, поднятый по ошибке. См. Их ответ. –