T-SQL: Wie Vergleiche ich zwei Variablen vom Typ XML bei der Länge > VarChar(MAX)?
Nur mithilfe von SQL Server 2008 R2 (dies wird in einer stored proc), wie kann ich feststellen, ob zwei Variablen des Typs XML sind äquivalent?
Hier ist, was ich tun will:
DECLARE @XmlA XML
DECLARE @XmlB XML
SET @XmlA = '[Really long Xml value]'
SET @XmlB = '[Really long Xml value]'
IF @XmlA = @XmlB
SELECT 'Matching Xml!'
Aber wie Sie wahrscheinlich wissen, gibt es:
Msg 305, Ebene 16, Status 1, Zeile 7 Der XML-Datentyp kann nicht sein
verglichen oder sortiert, außer bei der Verwendung von IS NULL-operator.
Kann ich umwandeln VarChar(MAX)
und vergleichen, aber das nur vergleicht die ersten 2MB. Gibt es einen anderen Weg?
Meinst du die ersten 2 GB? Ist XML wirklich größer als 2MB? Tun Sie wirklich wissen müssen, wenn es gleich ist? Wenn dem so ist, kann es besser sein, zu tun, der Vergleich, die außerhalb von SQL Server.
Hat Ihr gewünschten Vergleich behandeln
Sie können nicht speichern von XML - > 2 GB, das entspricht varchar(max). Aber streng genommen sollte es sein, varbinary(max)
Hat Ihr gewünschten Vergleich behandeln
<e />
gleich <e></e>
?VARCHAR(MAX)
können bis zu 2 GB von Daten (150x die Größe Tolstois Krieg und Frieden) - und Ihre XML ist größer als dieser!?!?!?Sie können nicht speichern von XML - > 2 GB, das entspricht varchar(max). Aber streng genommen sollte es sein, varbinary(max)
InformationsquelleAutor ScottBai | 2012-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stolperte ich über diese ziemlich umfangreichen Artikel die geht mehr ins detail, tatsächlich vergleicht den INHALT von 2 XML-Einträge, um festzustellen, ob Sie identisch sind. Es macht Sinn, denn die Reihenfolge der Attribute in Knoten unterscheiden KÖNNEN, auch wenn Ihre Werte sind genau die gleichen. Ich würde empfehlen, Sie Lesen es und auch implementieren Sie die Funktion, um zu sehen, ob es für Sie arbeitet... ich versuchte es schnell und es schien zu funktionieren für mich?
InformationsquelleAutor FarligOpptreden
Überprüfen Sie das SQL-Funktion:
Hier ist die Quelle
Schlägt die Funktion zum vergleichen von XML-Fragmente z.B., wenn es nicht ein einziges root-element, wie:
Um dieses Problem zu beheben, müssen Sie wickeln Sie Ihre XML-Dateien in
root
Elemente, wenn Sie an die Funktion übergeben oder Bearbeiten Sie die Funktion, dies zu tun. Zum Beispiel:seufz Bitte nicht veröffentlichen code, den Sie nicht verstehen. Es NICHT wieder eine boolean/bit, es gibt eine Ganzzahl zurück. Ein flüchtiger Blick auf den code zeigt, dass ein Rückgabewert von 0 bedeutet, dass 'es passt', Wert '1' bedeutet 'nicht'. Bitte führen Sie SELECT dbo.CompareXml('<data/>', '<data></data>') dbo.CompareXml('<data/>', '<data></data>') dbo.CompareXml('<data/>', '<data1234></data1234>') dbo.CompareXml('<data/>', '<data></data><dataa/>') und überprüfen Sie die Ergebnisse. Nur der 3. man gibt '1' zurück, die als " anders
Ich kann annehmen & code ändern, genau richtig; gemacht, dass für eine ganze Weile jetzt. Lassen Sie uns einige Fakten gerade hier. Sie sagte, "check this code" und ich habe, abgemahnt und zu kommentieren, wenn es fehlschlagen würde. Sie dann verweigert mein Kommentar, zu sagen, dass ich falsch war, und geben eine falsche Beschreibung, wie der code funktioniert. Dann habe ich einen konkreten test, um zu zeigen, seine Schwächen. Sie löschen dann deine falsche Bemerkung und gehen zu behaupten, dass ich den test, so wie es bewirkt, dass das zugrunde liegende problem! Ich schlage vor, dass Sie sich nicht verirren außerhalb Ihres Zuständigkeitsbereichs.
Ich bin damit einverstanden. Hinweis: der code wurde veröffentlicht, vor einigen Jahren, als ich versuchte, eine Lösung zu finden für die Frage, die ich hatte. Ich erinnere mich nicht, wie dieser code genau funktioniert. Ich werde es hinzufügen, um die Antwort. Bin ich Kommentare löschen, die veraltet sind oder nur spam.
InformationsquelleAutor gotqn
Gibt es viele verschiedene Möglichkeiten, wie der Vergleich von zwei XML-Dokumente, und viel hängt davon ab, welche Unterschiede Sie tolerieren möchten: Sie müssen auf jeden Fall tolerieren Unterschiede in der Kodierung, die Reihenfolge der attribute unerheblich whitespace-Zeichen, numerischen Zeichen Referenzen, und die Verwendung von Attribut Trennzeichen, und Sie sollten wahrscheinlich auch vertragen Unterschiede in der Verwendung von Kommentaren, namespace-Präfixe und CDATA. So dass der Vergleich von zwei XML-Dokumente als strings ist definitiv keine gute Idee - es sei denn, Sie rufen die XML-Kanonisierung ersten.
Für viele Zwecke der XQuery-tief-equals () - Funktion das richtige tut (und ist mehr oder weniger äquivalent zu vergleichen, die kanonischen Formen der beiden XML-Dokumente). Ich weiß nicht genug über Microsoft SQL Server-Implementierung von XQuery zu erzählen, wie Sie zum aufrufen dieser aus der SQL-Ebene.
InformationsquelleAutor Michael Kay
Du kannst nur Felder vom Datentyp varbinary(max), hash Sie und vergleichen von hashes. Aber Sie definitiv vermissen, wenn es XML-Dateien sind gleichwertig, aber nicht identisch
Berechnen hash können Sie entweder CLR-Funktion:
Oder sql-Funktion:
1. - Sie können nicht speichern > 2 GB in sql server xml-Feld. 2. - mit den richtigen hash-alg. (dh. md5, sha1) - Sie garantiert frei von Kollisionen Ergebnis
Sorry, ich meinte nähert 2GB, nicht größer als 2 GB sind. Und ich bin mir nicht so sicher, Sie sind garantiert frei von Kollisionen; John Huang schien zu zeigen, gerade vor ein paar Tagen: sqlnotes.info/2012/01/20/md5-collision Seine Kollision war nicht auf XML basiert, aber es ist immer noch ein Beispiel für einen Verstoß gegen Ihre 'Garantie'...
Für MD5 seiner möglich, aber zu vernachlässigen, für die SHA1 - immer noch unmöglich
Ich denke, das problem hier ist, dass eine der XML-Dateien enthalten kann extra Raum oder Attribute können umgeschaltet werden, und in diesem Fall halte ich-hash zu vergleichen, wird scheitern.
InformationsquelleAutor Oleg Dok
Wenn Sie können, verwenden Sie SQL CLR -, schlage ich vor, um eine Funktion schreiben, die mit XNode.DeepEquals Methode:
Wenn Sie nicht können, können Sie schreiben Sie Ihre eigene Funktion (siehe SQL FIDDLE-BEISPIEL):
InformationsquelleAutor Roman Pekar