Wie kann ich überprüfen, ob bei einer Datenbank in SQL Server zwischen Groß- und Kleinschreibung unterschieden wird? Ich habe die Abfrage zuvor ausgeführt:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
Aber ich suche nach anderen Wegen, da dies mir in der Vergangenheit Probleme bereitet hat.
Bearbeiten - Ein bisschen mehr Info: Ein vorhandenes Produkt verfügt über viele vordefinierte gespeicherte Prozeduren. In einer gespeicherten Prozedur @test != @TEST
abhängig von der Empfindlichkeit des Servers. Also, was ich suche, ist der beste Weg, um den Server auf seine Empfindlichkeit zu überprüfen.
Die Sortierung kann auf verschiedenen Ebenen festgelegt werden:
Sie könnten also eine case sensitive Spalte in einer case insensitiven Datenbank haben. Ich bin noch nicht auf eine Situation gestoßen, in der ein Geschäftsfall für die Groß-/Kleinschreibung einer einzelnen Datenspalte erstellt werden könnte, aber ich nehme an, dass dies der Fall sein könnte.
Check Server Collation
SELECT SERVERPROPERTY('COLLATION')
Datenbanksortierung prüfen
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Spaltensortierung prüfen
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Wenn Sie SQL Server mit den Standardoptionen für die Sortierung installiert haben, stellen Sie möglicherweise fest, dass die folgenden Abfragen dieselben Ergebnisse liefern:
CREATE TABLE mytable
(
mycolumn VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT mytable VALUES('Case')
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
Sie können Ihre Abfrage ändern, indem Sie die Sortierung auf Spaltenebene erzwingen:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'case'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case'
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
SELECT DATABASEPROPERTYEX('<database name>', 'Collation')
Da das Ändern dieser Einstellung Auswirkungen auf Anwendungen und SQL-Abfragen haben kann, würde ich diesen Test zuerst isolieren. In SQL Server 2000 können Sie auf einfache Weise eine ALTER TABLE-Anweisung ausführen, um die Sortierreihenfolge einer bestimmten Spalte zu ändern, sodass zwischen Groß- und Kleinschreibung unterschieden wird. Führen Sie zuerst die folgende Abfrage aus, um zu bestimmen, auf was Sie sie zurücksetzen müssen:
EXEC sp_help 'mytable'
Das zweite Recordset sollte in einem Standardszenario die folgenden Informationen enthalten:
Column_Name Collation
mycolumn SQL_Latin1_General_CP1_CI_AS
Was auch immer die Spalte "Sortierung" zurückgibt, Sie wissen jetzt, worauf Sie es zurücksetzen müssen, nachdem Sie die folgende Änderung vorgenommen haben, wodurch die Groß- und Kleinschreibung berücksichtigt wird:
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE Latin1_General_CS_AS
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
Wenn dies zu Problemen führt, können Sie es einfach durch Ausgeben einer neuen ALTER TABLE-Anweisung zurücksetzen (achten Sie darauf, meinen COLLATE-Bezeichner durch den zuvor gefundenen zu ersetzen):
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CI_AS
Wenn Sie mit SQL Server 7.0 nicht weiterkommen, können Sie diese Problemumgehung ausprobieren, die möglicherweise eher zu einer Leistungsbeeinträchtigung führt (Sie sollten nur ein Ergebnis für die ERSTE Übereinstimmung erhalten):
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10))
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
SQL Server bestimmt die Groß- und Kleinschreibung durch COLLATION
.
COLLATION
kann auf verschiedenen Ebenen eingestellt werden.
Man kann das COLLATION
auf jeder Ebene überprüfen, wie in Raj More's answer erwähnt.
Server-Sortierung prüfen
SELECT SERVERPROPERTY('COLLATION')
Datenbanksortierung prüfen
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Spaltensortierung prüfen
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Ausdruckssortierung prüfen
Für Ausdrucksebene COLLATION
müssen Sie den Ausdruck betrachten. :)
Es wäre im Allgemeinen am Ende des Ausdrucks wie im folgenden Beispiel.
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
Sortierungsbeschreibung
Versuchen Sie dies, um eine Beschreibung der einzelnen COLLATION
Werte zu erhalten.
SELECT * FROM fn_helpcollations()
Und Sie sollten so etwas sehen.
Sie können immer eine WHERE
-Klausel zum Filtern und Anzeigen der Beschreibung nur für Ihr COLLATION
einfügen.
Eine Liste der Kollatierungen finden Sie hier .
Sie interessieren sich für die Zusammenstellung. Sie könnten etwas basierend auf diesem Snippet erstellen:
SELECT DATABASEPROPERTYEX('master', 'Collation');
pdate
Basierend auf Ihrer Bearbeitung - Wenn @test
und @TEST
kann immer auf zwei verschiedene Variablen verweisen, es ist kein SQL Server. Wenn Sie Probleme sehen, bei denen die gleiche Variable nicht mit sich selbst übereinstimmt, überprüfen Sie, ob diese Variable NULL
ist, weil NULL = NULL
gibt `false zurück.
Die beste Möglichkeit, mit bereits erstellten Tabellen zu arbeiten, besteht darin, zum SQL Server-Abfrage-Editor zu wechseln
Art: sp_help <tablename>
Dies zeigt die Struktur der Tabelle an, siehe die Details für das gewünschte Feld in der Spalte COLLATE.
dann tippe die Abfrage wie folgt ein:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
Es kann sich um ein anderes Zeichenschema handeln. <SQL_Latin1_General_CP1_CI_AS
>, um das genaue Schema herauszufinden, das für diese Spalte verwendet wurde.
Wie kann ich überprüfen, ob bei einer Datenbank in SQL Server zwischen Groß- und Kleinschreibung unterschieden wird?
Sie können die folgende Abfrage verwenden, bei der die Rückgabe Ihrer informierten Datenbank zwischen Groß- und Kleinschreibung unterscheidet oder die binäre Sortierung verwendet wird (mit dem Ergebnis null):
;WITH collations AS (
SELECT
name,
CASE
WHEN description like '%case-insensitive%' THEN 0
WHEN description like '%case-sensitive%' THEN 1
END isCaseSensitive
FROM
sys.fn_helpcollations()
)
SELECT *
FROM collations
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));
Lesen Sie weiter diese MSDN-Information ;).