anderes Ergebnis bei 2005 als bei 2000

25/07/2008 - 12:19 von Oliver Schröder | Report spam
Hallo NG,

im Anhang findest ihr ein kleines SQL-Script, bei dessen Ausführung
Unterschiede im Verhalten von SQL-Server 2000 und 2005 sichtbar werden.

Betroffen ist die Auswertung von hexadezimalen Ausdrücken in Abhàngigkeit
von der angegeben Stringlànge ( z.B.: 0x0200 nicht immer gleich
0x00000200 ). Ist das ein Fehler oder so gewollt?

Zwar habe ich unter
http://msdn.microsoft.com/de-de/lib...px#_binary folgenden
Hinweis gefunden:
"Konvertierungen zwischen einem beliebigen Datentyp und den
binary-Datentypen sind bei unterschiedlichen SQL Server-Versionen nicht
unbedingt identisch."
Das hilft mir aber nicht recht weiter. Wir verwenden in unseren
gespeicherten Prozeduren hàufig Verknüpfungen von hexadezimalen (binàren)
Ausdrücken, da bei uns Eigenschaften eines Objekts oft durch die einzelnen
Bits eines Integer-Felds repràsentiert werden.

Danke!

Oliver


/*
| liefert unter SQL-Server 2000 den Wert 0x0200 --> OK
| liefert unter SQL-Server 2005 den Wert 0x02 --> NICHT OK
*/
Select
Case
When 0x800000 = 0x800000
Then 0x0200
Else 0x00000000 -- siehe Änderung im nàchsten Select
End

/*
| liefert unter SQL-Server 2000 den Wert 0x0200 --> OK
| liefert unter SQL-Server 2005 den Wert 0x0200 --> OK
*/
Select
Case
When 0x800000 = 0x800000
Then 0x0200
Else 0x0000 -- hier nur andere Anzahl Nullen als im vorangegangenen Select
End
/*
| Obwohl der "Else"-Zweig in beiden Beispielen nicht durchlaufen wird,
| àndert sich das Ergebnis der Abfrage unter SQL-Server 2005 durch die
| Verwendung der Stringlànge im "Else"-Zweig.
| Wahrscheinlich finden unterschiedliche implizite Konvertierungen
| statt, die sich mir aber nicht recht erschließen.
*/
 

Lesen sie die antworten

#1 Stefan Hoffmann
25/07/2008 - 14:58 | Warnen spam
hallo Oliver,

Oliver Schröder schrieb:
Betroffen ist die Auswertung von hexadezimalen Ausdrücken in
Abhàngigkeit von der angegeben Stringlànge ( z.B.: 0x0200 nicht immer
gleich 0x00000200 ). Ist das ein Fehler oder so gewollt?


Es scheint sich hier wohl um einen Bug zu handeln:

SELECT
CAST(CASE WHEN 1 = 1 THEN 0x00000200 ELSE 0x0000 END AS INT),
CAST(CASE WHEN 1 = 1 THEN 0x0000200 ELSE 0x0000 END AS INT),
CAST(CASE WHEN 1 = 1 THEN 0x000200 ELSE 0x0000 END AS INT),
CAST(CASE WHEN 1 = 1 THEN 0x00200 ELSE 0x0000 END AS INT),
CAST(CASE WHEN 1 = 1 THEN 0x0200 ELSE 0x0000 END AS INT),
CAST(CASE WHEN 1 = 1 THEN 0x200 ELSE 0x0000 END AS INT)

SELECT
CAST(CASE WHEN 1 = 1 THEN 0x00000200 ELSE 0x0000 END AS BINARY(4)),
CAST(CASE WHEN 1 = 1 THEN 0x0000200 ELSE 0x0000 END AS BINARY(4)),
CAST(CASE WHEN 1 = 1 THEN 0x000200 ELSE 0x0000 END AS BINARY(4)),
CAST(CASE WHEN 1 = 1 THEN 0x00200 ELSE 0x0000 END AS BINARY(4)),
CAST(CASE WHEN 1 = 1 THEN 0x0200 ELSE 0x0000 END AS BINARY(4)),
CAST(CASE WHEN 1 = 1 THEN 0x200 ELSE 0x0000 END AS BINARY(4))


mfG

Ähnliche fragen