SQL Server Kontrolle Fall-Empfindlichkeit?
-
05-07-2019 - |
Frage
Wie kann ich überprüfen, um zu sehen, ob eine Datenbank in SQL Server ist case-sensitive? Ich habe vorher die Abfrage läuft:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
Aber ich bin auf der Suche nach anderen Wegen, wie dies eigentlich mir Probleme in der Vergangenheit gegeben hat.
Bearbeiten - Ein wenig mehr Informationen:
Ein bestehendes Produkt hat viele bereits geschriebene Stored Procedures. In einer gespeicherten Prozedur @test != @TEST
abhängig von der Empfindlichkeit des Servers selbst. Also, was ich suche, ist der beste Weg, um den Server für seine Empfindlichkeit zu überprüfen.
Lösung
Sortierungs kann auf verschiedenen Ebenen eingestellt werden:
- Server
- Datenbank
- Spalte
So haben Sie eine Case Sensitive Spalte in einer Case Insensitive Datenbank haben könnten. Ich habe noch nicht auf eine Situation kommen, wo ein Business Case für die Groß- und Kleinschreibung von einer einzigen Spalte von Daten vorgenommen werden könnte, aber ich nehme an, es könnte sein.
Überprüfen Sie Server-Sortierungs
SELECT SERVERPROPERTY('COLLATION')
Check-Datenbank Sortierungs
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Überprüfen Spalte Sortierungs
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Andere Tipps
Wenn Sie SQL Server mit den Optionen Sortierungsstandardmäßig installiert, könnten Sie feststellen, dass die folgenden Abfragen die gleichen Ergebnisse zurück:
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 Sortierungs auf Spaltenebene zu zwingen:
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')
Diese Einstellung Wie Ändern können Anwendungen und SQL-Abfragen auswirken, würde ich diesen Test zuerst isolieren. Von SQL Server 2000 können Sie ganz einfach eine ALTE TABLE-Anweisung ausführen, um die Sortierreihenfolge einer bestimmten Spalte zu ändern, zwingen es Groß- und Kleinschreibung zu sein. Zuerst führen Sie die folgende Abfrage, um festzustellen, was Sie es zurück ändern müssen:
EXEC sp_help 'mytable'
Der zweite Re-Cord sollte die folgenden Informationen, die in einem Standardszenario enthalten:
Column_Name Sortierungs
mycolumn SQL_Latin1_General_CP1_CI_AS
Was auch immer die ‚Sortierungs‘ Spalte zurückkehrt, Sie wissen jetzt, was Sie brauchen, es zu ändern zurück, nachdem Sie die folgende Änderung vornehmen, die Groß- und Kleinschreibung zwingen 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 diese Schrauben Dinge, können Sie es wieder ändern können, einfach durch eine neue Anweisung ALTER TABLE Ausgabe (unbedingt meine COLLATE Kennung mit dem ersetzen, die Sie vorher gefunden):
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CI_AS
Wenn Sie mit SQL Server 7.0 stecken geblieben sind, können Sie diese Abhilfe versuchen, die ein wenig mehr von einem Performance-Hit sein könnte (Sie sollten nur ein Ergebnis für das erste Spiel 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, Groß- und Kleinschreibung von COLLATION
.
COLLATION
kann auf verschiedenen Ebenen eingestellt werden.
- Server-Ebene
- Datenbank-Ebene
- Spalte-Ebene
- Expression-Ebene
kann man die COLLATION
auf jeder Ebene überprüfen, wie in Raj Mehr Antwort .
Überprüfen Sie Server-Sortierungs
SELECT SERVERPROPERTY('COLLATION')
Check-Datenbank Sortierungs
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
Überprüfen Spalte Sortierungs
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
Prüfausdrucks Sortierungs
Für die Expression Ebene COLLATION
Sie müssen auf den Ausdruck suchen. :)
Es wäre am Ende des Ausdrucks wie im folgende Beispiel im Allgemeinen sein.
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
Sortierungs Beschreibung
Für jeden COLLATION
Wert bekommt Beschreibung dieses versuchen.
SELECT * FROM fn_helpcollations()
Und Sie sollten etwas sehen.
Sie können jederzeit eine WHERE
Klausel setzen Beschreibung nur für Ihre COLLATION
zu filtern und sehen.
Sie können eine Liste von Sortierungen finden hier .
Sie sind in der Zusammenstellung interessiert. Sie könnten etwas auf der Grundlage dieser Schnipsel bauen:
SELECT DATABASEPROPERTYEX('master', 'Collation');
Aktualisieren
Basierend auf dem Bearbeiten - Wenn @test
und @TEST
je zwei verschiedene Variablen beziehen können, ist es nicht SQL Server. Wenn Sie Probleme sehen, wo die gleichen Variable nicht gleich selbst ist, prüfen Sie, ob diese Variable NULL
ist, weil NULL = NULL
gibt `falsch.
Der beste Weg, mit bereits erstellten Tabellen zu arbeiten, ist, dass, Zur SQL Server-Abfrage-Editor
Typ: sp_help <tablename>
Dies wird Tabellenstruktur zeigen, die Details für das gewünschte Feld unter COLLATE Spalt sehen.
Geben Sie dann die Abfrage wie:
SELECT myColumn FROM myTable
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
Es könnte verschiedenes Zeichenschema sein <SQL_Latin1_General_CP1_CI_AS
>, so besser, um das genaue Schema herauszufinden, die gegen diese Spalte verwendet wurden.
Wie kann ich überprüfen, ob eine Datenbank in SQL Server ist case-sensitive?
Sie unter Abfrage verwenden können, die Ihre fundierte Datenbank zurückgibt, ist Groß- und Kleinschreibung oder nicht oder in binärer Art (mit Null-Ergebnis):
;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'));
Für mehr lesen diese MSDN Informationen ;.)
SQL Server ist nicht case sensitiv. SELECT * FROM SomeTable
ist die gleiche wie SeLeCT * frOM soMetaBLe
.