wake-up-neo.com

SQL Server Groß- und Kleinschreibung prüfen?

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.

47
Kyle

Die Sortierung kann auf verschiedenen Ebenen festgelegt werden:

  1. Server
  2. Datenbank
  3. Säule

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
71
Raj More

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' 
33

SQL Server bestimmt die Groß- und Kleinschreibung durch COLLATION.

COLLATION kann auf verschiedenen Ebenen eingestellt werden.

  1. Serverebene
  2. Datenbankebene
  3. Spaltenebene
  4. Ausdrucksebene

Hier ist die MSDN-Referenz.

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.

enter image description here

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 .

7
Devraj Gadhavi

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.

4
Joel Coehoorn

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.

2
DareDevil

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 ;).

1
shA.t