Leerzeichen am Ende einer Zeichenkette in der Datenbank

19/01/2009 - 10:21 von Juergen Gramm | Report spam
Hallo Zusammen,

ich erstelle per SMO eine SQLServer-Datenbank. Einige der char- und
varchar-Spalten beinhalten auch Werte, die Leerzeichen am Ende haben.
Leider werden die automatisch abgeschnitten. Besonders àrgerlich ist
dies bei Spalten, auf denen ein eindeutiger Index liegt, da ich auf
diese Weise doppelte Eintràge erhalte (mit den entsprechenden
Konsequenzen).

Ich habe schon versucht, nach dem Erstellen der Datenbank die Eigenschaft
DatabaseOption.AnsiPaddingEnabled auf true zu setzen, was leider keine
Änderung brachte.

Zu den Spalten existiert die Eigenschaft AnsiPaddingStatus, welche aber
leider nicht zu Ändern ist.

Gibt es eine Chance, dass ich diese Anforderungen umsetzten kann?

Vielen Dank schonmal im Vorraus,
Juergen
 

Lesen sie die antworten

#1 Elmar Boye
19/01/2009 - 12:12 | Warnen spam
Hallo Jürgen,

Juergen Gramm schrieb:
ich erstelle per SMO eine SQLServer-Datenbank. Einige der char- und
varchar-Spalten beinhalten auch Werte, die Leerzeichen am Ende haben.
Leider werden die automatisch abgeschnitten. Besonders àrgerlich ist
dies bei Spalten, auf denen ein eindeutiger Index liegt, da ich auf
diese Weise doppelte Eintràge erhalte (mit den entsprechenden
Konsequenzen).



Leerzeichen am Ende werden bei Vergleichen von Zeichenfolgen
nicht berücksichtigt. Und sie àndert nicht an der Eindeutigkeit
von Indizes àndern, es gilt also z. B.:
'a' = 'a ' = 'a '

SET ANSI_PADDING ON -- oder auch OFF
GO
CREATE TABLE dbo.Tabelle (
Spalte varchar(10) NOT NULL UNIQUE )
GO
INSERT INTO dbo.Tabelle (Spalte) VALUES('a')

INSERT INTO dbo.Tabelle (Spalte) VALUES('a ')
INSERT INTO dbo.Tabelle (Spalte) VALUES('a ')
INSERT INTO dbo.Tabelle (Spalte) VALUES('a ')


Ich habe schon versucht, nach dem Erstellen der Datenbank die Eigenschaft
DatabaseOption.AnsiPaddingEnabled auf true zu setzen, was leider keine
Änderung brachte.



Die ANSI_PADDING Option bewirkt nur, dass die Datenbank-Engine
keine Leerzeichen am Ende entfernt.
<URL:http://msdn.microsoft.com/de-de/lib...3.aspx>

Es àndert jedoch nichts an den Vergleichen.

Am Rande: Für neue Datenbanken sollte ANSI_PADDING immer True sein,
da dies für einige Funktionen Pflicht ist und die Option in einer
spàteren Version entfallen wird.

Zu den Spalten existiert die Eigenschaft AnsiPaddingStatus, welche aber
leider nicht zu Ändern ist.



Der Status wird beim Erstellen der Tabelle (bzw. Spalte) festgelegt
und kann nur durch ein erneutes Erstellen geàndert werden.
Bei SMO müssen dazu die UserOptions beim Erstellen entsprechend
gesetzt sein:
<URL:http://msdn.microsoft.com/de-de/lib...s.aspx>

Zum Schluß: Im Interesse der Vergleichbarkeit in Programmen sollte
man nachfolgende Leerzeichen vor dem Speichern entfernen, denn in
.NET(und auch anderswo) werden sie bei Vergleichen berücksichtigt:

Console.WriteLine("Ist gleich: {0}, {1}",
"a".Equals("a "), // falsch
"a".CompareTo("a ")); // -1

Gruß Elmar

Ähnliche fragen