33 Stimmen

SQL Server 2008 Eindeutige Spalte, bei der die Groß-/Kleinschreibung beachtet wird

Gibt es eine Möglichkeit, eine Spalte sowohl UNIQUE als auch Case Sensitive zu machen?

Ich möchte in der Lage sein, die

abcde y ABCDE

in einer eindeutigen Spalte.

12 Stimmen

@Mitch: vielleicht steht er vor Fall #10 :-) man weiß ja nie....

0 Stimmen

Ganz einfach: Ich möchte mehr Möglichkeiten haben. Ich erwarte, dass die Tabelle wirklich sehr groß wird, so dass ich 62 Zeichenoptionen anstelle von 36 habe. abc... ABC... 123... Außerdem verwendet das Feld nur 5 Zeichen.

0 Stimmen

Dieser Beitrag ist im Grunde eine Ergänzung zu einem anderen Beitrag stackoverflow.com/questions/1513911/

46voto

marc_s Punkte 701497

Die Eindeutigkeit kann mit einer eindeutigen Einschränkung erzwungen werden.

Ob der eindeutige Index Groß-/Kleinschreibung beachtet oder nicht, wird durch die Server- (oder Tabellen-) Kollation .

Mit dieser Abfrage können Sie die aktuelle Sortierung Ihrer Datenbank ermitteln:

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

und Sie sollten etwas erhalten wie:

SQLCollation
————————————
SQL_Latin1_General_CP1_CI_AS

Hier bedeutet das "CI_AS" am Ende der Sortierung: CI = Case Insensitive, AS = Accent sensitive.

Dies kann nach Bedarf geändert werden. Wenn Ihre Datenbank und/oder Tabelle eine Groß-/Kleinschreibung unterscheidet, würde ich erwarten, dass die Eindeutigkeit Ihres Indexes ebenfalls von der Groß-/Kleinschreibung abhängt, z.B. Ihre abcdef y ABCDEF sollten beide als eindeutige Zeichenketten akzeptiert werden.

Marc

UPDATE

Ich habe dies gerade ausprobiert (SQL Server 2008 Developer Edition x64) - funktioniert bei mir (meine Datenbank verwendet im Allgemeinen die Kollation "Latin1_General_CI_AS", aber ich kann pro Tabelle / pro VARCHAR-Spalte sogar eine andere definieren):

CREATE TABLE TestUnique
    (string VARCHAR(50) COLLATE SQL_Latin1_General_Cp1_CS_AS)

CREATE UNIQUE INDEX UIX_Test ON dbo.TestUnique(string)

INSERT INTO dbo.TestUnique(string) VALUES ('abc')
INSERT INTO dbo.TestUnique(string) VALUES ('ABC')

SELECT * FROM dbo.TestUnique

und ich komme zurück:

string
ABC
abc

und keine Fehlermeldung, dass der eindeutige Index verletzt wurde.

1 Stimmen

Ich habe das von marc aufgeführte Skript ausprobiert und es hat bei mir gut funktioniert, auf SQL Server 2008, 32bit.

0 Stimmen

Es scheint, dass es keine Möglichkeit gibt, dies in der Benutzeroberfläche pro Tabelle zu tun. Es kann jedoch während der Datenbankerstellung für die gesamte Datenbank durchgeführt werden, was ein wenig zu weitreichend erscheint.

0 Stimmen

Ich bin dankbar für das SQL-Skript, mit dem es pro Tabelle durchgeführt werden kann. Es war einfach, das einzufügen und zu überprüfen, dass SELECT * FROM TestUnique WHERE [string] = 'ABC' nur eine Zeile zurückgibt, wie ich es erwarten würde.

5voto

Devraj Gadhavi Punkte 3407

Für den Fall, dass jemand dies bei einer bestehenden Tabelle tun muss, die bereits eine unique key/index definiert auf einem varchar / nvarchar Spalte, hier ist das Skript.

ALTER TABLE [YourTable] DROP CONSTRAINT [UIX_YourUniqueIndex]
GO

ALTER TABLE [YourTable] ALTER COLUMN [YourColumn] [nvarchar](50) COLLATE Latin1_General_CS_AS NOT NULL;
GO

ALTER TABLE [YourTable] ADD  CONSTRAINT [UIX_YourUniqueIndex] UNIQUE NONCLUSTERED 
(
    [YourColumn] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

0voto

Gerd Foerthmann Punkte 11

Ich musste Daten aus einer Datenbank importieren, die Groß- und Kleinschreibung unterscheidet. Als ich versuchte, den Primärschlüssel in die Spalte zu setzen, die der Primärschlüssel in der Quelle ist, konnte ich das nicht tun, weil es doppelte Schlüssel gab. Ich änderte die Sortierreihenfolge für die Spalte (varchar) auf Groß- und Kleinschreibung (Rechtsklick auf die Tabelle, wählen Sie Design, markieren Sie die Spalte, die Sie ändern möchten, und klicken Sie auf das Auslassungszeichen in Sortierreihenfolge) und jetzt funktioniert es gut. (SQL Server 2008 R2 64 bit).

0voto

Kent Kruckeberg Punkte 361

Danke @Devraj Gadhavi für die Schritt-für-Schritt-Anleitung, denn das ist genau das, was ich auch tun musste. Ich war kurz davor, diese Skripte zu erstellen, aber dann habe ich (mit SSMS 2008R2) das Gleiche auf eine etwas faulere Weise erreicht :-). In der Strukturansicht suchte ich meine Tabelle und Spalte und klickte dann mit der rechten Maustaste auf die Spalte, deren Sortierung ich ändern wollte, und wählte "Ändern". Im angezeigten Fenster änderte ich die Sortierung in den Eigenschaften auf die Groß- und Kleinschreibung, dann klickte ich irgendwo in den offenen Bereich im oberen Teil des Fensters (wo die Spalten in Tabellenform aufgelistet sind) mit der rechten Maustaste und wählte "Änderungsskript generieren..."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X