ukulele
Datenbank-Guru
- Beiträge
- 5.394
Ich habe eines meiner Scripte zum Konvertieren von Daten von vor ein oder zwei Jahren genommen und für einen neuen Zweck leicht angepasst. In mehreren Schritten zerlege ich dabei eine Zeile aus einer CSV-Datei und baue sie später mit FOR XML PATH wieder zusammen. Der Grund sind nicht escapte Trennzeichen (Semikolon), spielt aber eigentlich für mein Problem keine Rolle.
Ich habe das auf einem SQL 2019 Developer geschrieben, lief noch auf einem Windows 2012 R2. Die VM gibt es nicht mehr, ich kann das leider nicht prüfen. Aktuell führe ich mein Script auf Server 2022 mit SQL 2022 aus und laufe in ein Problem, das früher eigentlich so nicht dagewesen sein kann. Ich kann mir nicht vorstellen, das sich die beiden Systeme unterschiedlich verhalten aber ich kann mir auch nicht erklären, warum mir das beim ersten mal nicht zum Verhängnis geworden ist. Auch finde ich das Verhalten allgemein etwas merkwürdig und vor allem unerwartet an dieser Stelle.
Hier mal eine Beschränkung auf das absolut Wesentliche:
stuff() und FOR XML PATH bauen einfach nur die verschiedenen Werte wieder zusammen zu einem String. Dabei wird aus dem &-Zeichen ein & und das sorgt im späteren Verlauf für Probleme. Natürlich kann ich & jetzt wieder durch & ersetzen bevor ich weiter mache - nicht so schön aber praktikabel. Nur ist mir das vorher nie aufgefallen und ich verstehe auch den Grund nicht. Ich dachte erst, es liegt an der COLLATION oder an NVARCHAR(), damit hat man ja beim Import immer seinen Ärger. Es scheint aber immer aufzutreten, egal was ich da verwende.
Kann mir jemand das Verhalten erklären oder eine Quelle nennen, die das bestätigt? Ist das einfach immer so?[/CODE]
Ich habe das auf einem SQL 2019 Developer geschrieben, lief noch auf einem Windows 2012 R2. Die VM gibt es nicht mehr, ich kann das leider nicht prüfen. Aktuell führe ich mein Script auf Server 2022 mit SQL 2022 aus und laufe in ein Problem, das früher eigentlich so nicht dagewesen sein kann. Ich kann mir nicht vorstellen, das sich die beiden Systeme unterschiedlich verhalten aber ich kann mir auch nicht erklären, warum mir das beim ersten mal nicht zum Verhängnis geworden ist. Auch finde ich das Verhalten allgemein etwas merkwürdig und vor allem unerwartet an dieser Stelle.
Hier mal eine Beschränkung auf das absolut Wesentliche:
Code:
CREATE DATABASE test;
USE test;
SELECT DATABASEPROPERTYEX('test', 'Collation') AS DefaultCollation;
CREATE TABLE t(
line SMALLINT,
[value] NVARCHAR(MAX),
value_number SMALLINT
);
INSERT INTO t VALUES (1,N'&',1),(1,N'b',2),(1,N'c',3);
SELECT *
FROM t;
/*
1 & 1
1 b 2
1 c 3
*/
SELECT stuff(( SELECT '' + t.[value]
FROM t
ORDER BY t.value_number
FOR XML PATH('')),1,0,'');
/*
&bc
*/
DROP TABLE t;
CREATE TABLE t(
line SMALLINT,
[value] VARCHAR(MAX),
value_number SMALLINT
);
INSERT INTO t VALUES (1,'&',1),(1,'b',2),(1,'c',3);
SELECT *
FROM t;
/*
1 & 1
1 b 2
1 c 3
*/
SELECT stuff(( SELECT '' + t.[value]
FROM t
ORDER BY t.value_number
FOR XML PATH('')),1,0,'');
/*
&bc
*
Kann mir jemand das Verhalten erklären oder eine Quelle nennen, die das bestätigt? Ist das einfach immer so?[/CODE]