2017-02-06 4 views
0

Недавно мне был назначен проект бывшего коллеги, в котором синхронизация данных инвентаризации 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 невозможно, так как ключ содержит нечисловые символы почти во всех строках. В таблице нет других ключевых полей, и добавление одного вручную невозможно, поскольку:

  1. В таблице 5500+ строк.
  2. SAP не поддерживает, чтобы его таблицы подвергались UPDATE на SQL-сервере и блокировали базу данных, если она обнаруживает несогласованность.

Я не могу изменить структуру XML, потому что тогда API с другой стороны не примет его.

Так что мой вопрос: есть ли способ использовать ROW_NUMBER() с ключом nvarchar? Или альтернатива ROW_NUMBER(), которая работает с нечисловыми клавишами?

+0

Я только что пробовал свой код и не имею проблем с созданием требуемого XML, что дает вам сообщение об ошибке. Добавление некоторых выборочных данных тоже поможет. –

+2

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что пользователь задает вопрос, поднятый по ошибке. См. Их ответ. –

ответ

0

В ролях row_number() в строку:

SELECT CAST(ROW_NUMBER() OVER (ORDER BY items.ItemCode) as VARCHAR(255)) as MessageID, 
     items.ItemCode as SKU 
FROM OITM items 
FOR XML PATH('Message'), ROOT('Messages'); 
1

... d'Ах, эта ошибка давалось совершенно другой линии. Казалось бы, я слепой и немой.

Не стесняйтесь оценивать вопрос, потому что Я полностью его заслуживаю.

+0

Случается со всеми нами время от времени :-) –