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.

War es hilfreich?

Lösung

Sortierungs kann auf verschiedenen Ebenen eingestellt werden:

  1. Server
  2. Datenbank
  3. 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.

  1. Server-Ebene
  2. Datenbank-Ebene
  3. Spalte-Ebene
  4. Expression-Ebene

Hier ist die MSDN Referenz.

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.

eingeben Bild Beschreibung hier

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top