2017-02-06 2 views
0

Ich habe vor kurzem ein Projekt von einem ehemaligen Kollegen zugewiesen wurde, die SAP Bestandsinformationen zu synchronisieren. Ein Teil davon beinhaltet das Generieren von XML-Dateien - und hier liegt mein Dilemma.Verwendung von ROW_NUMBER mit nvarchar Schlüsseln

In der XML-Struktur I zu folgen, wird jeder Inventargegenstand in einem Message Element mit einem numerischen ID enthalten sind, irgendwie wie folgt aus:

<Messages> 
    <Message> 
     <MessageID>1</MessageID> 
     <first item /> 
    </Message> 
    <Message> 
     <MessageID>2</MessageID> 
     <second item /> 
    </Message> 
</Messages> 

Die MessageID Feld dient als eine Zeilennummer: es Schritten von 1 zur Anzahl der Zeilen in der Ergebnismenge. Das Problem ist, der Primärschlüssel der Tabelle ist nvarchar aber ROW_NUMBER() OVER(ORDER BY) erfordert eine bigint Schlüssel, so dass der folgende Code:

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

nicht mit

Fehler auf numerische Datentyp varchar Umwandlung

Casting ItemCode bis bigint ist nicht möglich, da der Schlüssel in fast allen Zeilen nicht numerische Zeichen enthält. Es gibt auch keine anderen Schlüsselfelder in der Tabelle und das Hinzufügen von Hand ist nicht möglich, weil:

  • Es gibt 5500 + Zeilen in der Tabelle.
  • SAP nicht unterstützt seine Tabellen auf dem SQL-Backend zu einem UPDATE unterworfen wird und sperrt die Datenbank, wenn es Inkonsistenz feststellt.
  • Ich kann die XML-Struktur nicht ändern, weil dann die API auf der anderen Seite es nicht akzeptiert.

    Also meine Frage ist: Gibt es eine Möglichkeit ROW_NUMBER() mit einem Schlüssel zu verwenden? Oder eine Alternative zu ROW_NUMBER(), die mit nicht numerischen Tasten funktioniert?

    +0

    Ich habe gerade Ihren Code ausprobiert und habe kein Problem, das erforderliche XML zu erzeugen, was Ihnen die Fehlermeldung gibt. Hinzufügen von Beispieldaten würde auch helfen. –

    +2

    Ich stimme für das Schließen dieser Frage als Off-Topic ab, da der Benutzer die irrtümlich gestellte Frage angibt. Siehe ihre Antwort. –

    Antwort

    0

    Guss die row_number() in einen String:

    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'oh, dass Fehler durch eine ganz andere Linie gegeben wurde. Ich bin blind und dumm, so scheint es.

    Fühlen Sie sich frei, die Frage zu bewerten, weil ich es voll verdienen.

    +0

    Das passiert uns allen hin und wieder :-) –