SQL Server verifica la distinzione tra maiuscole e minuscole?

Come posso verificare se un database in SQL Server fa distinzione tra maiuscole e minuscole? In precedenza ho eseguito la query:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END 

Ma sto cercando altri modi in quanto questo mi ha effettivamente dato problemi in passato.

Modifica – Un po ‘più di informazioni: un prodotto esistente ha molte stored procedure pre-scritte. In una stored procedure @test != @TEST base alla sensibilità del server stesso. Quindi quello che sto cercando è il modo migliore per verificare la sensibilità del server.

Le regole di confronto possono essere impostate a vari livelli:

  1. server
  2. Banca dati
  3. Colonna

Quindi potresti avere una colonna Case Sensitive in un database Case Insensitive. Non mi sono ancora imbattuto in una situazione in cui un caso aziendale potesse essere fatto per la distinzione tra maiuscole e minuscole di una singola colonna di dati, ma suppongo che potrebbe esserci.

Controlla le regole di confronto del server

 SELECT SERVERPROPERTY('COLLATION') 

Controlla le regole di confronto dei database

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

Controlla le regole di confronto delle colonne

 select table_name, column_name, collation_name from INFORMATION_SCHEMA.COLUMNS where table_name = @table_name 

Se hai installato SQL Server con le opzioni di confronto predefinite, potresti scoprire che le seguenti query restituiscono gli stessi risultati:

 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' 

Puoi modificare la query forzando le regole di confronto a livello di colonna:

 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('', 'Collation') 

Poiché la modifica di questa impostazione può influire su applicazioni e query SQL, isolerei prima questo test. Da SQL Server 2000, è ansible eseguire facilmente un’istruzione ALTER TABLE per modificare l’ordinamento di una colonna specifica, forzando la distinzione tra maiuscole e minuscole. Innanzitutto, esegui la seguente query per determinare di cosa hai bisogno per cambiarlo in:

 EXEC sp_help 'mytable' 

Il secondo recordset dovrebbe contenere le seguenti informazioni, in uno scenario predefinito:

Column_Name Collation


mycolumn SQL_Latin1_General_CP1_CI_AS

Qualunque sia la colonna “Collation” restituita, ora sai di cosa hai bisogno per cambiarlo dopo aver apportato la seguente modifica, che costringerà la distinzione tra maiuscole e minuscole:

 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' 

Se questo dovesse rovinare tutto, puoi cambiarlo, semplicemente pubblicando una nuova istruzione ALTER TABLE (assicurati di sostituire il mio identificativo COLLATE con quello che hai trovato in precedenza):

 ALTER TABLE mytable ALTER COLUMN mycolumn VARCHAR(10) COLLATE SQL_Latin1_General_CP1_CI_AS 

Se si è bloccati con SQL Server 7.0, è ansible provare questa soluzione alternativa, che potrebbe essere un po ‘più di un risultato di prestazioni (si dovrebbe ottenere solo un risultato per la prima partita):

 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 determina la distinzione tra maiuscole e minuscole per COLLATION .

COLLATION può essere impostato a vari livelli.

  1. Server a livello
  2. A livello di database
  3. Colonna a livello
  4. Espressione di livello

Ecco il riferimento MSDN.

Si può controllare la COLLATION ad ogni livello come menzionato nella risposta di Raj More .

Controlla le regole di confronto del server

 SELECT SERVERPROPERTY('COLLATION') 

Controlla le regole di confronto dei database

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

Controlla le regole di confronto delle colonne

 select table_name, column_name, collation_name from INFORMATION_SCHEMA.COLUMNS where table_name = @table_name 

Controlla le regole di confronto delle espressioni

Per il livello di espressione COLLATION devi guardare l’espressione. 🙂

Sarebbe generalmente alla fine dell’espressione come nell’esempio seguente.

 SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI; 

Descrizione della collazione

Per ottenere la descrizione di ogni valore COLLATION prova questo.

 SELECT * FROM fn_helpcollations() 

E dovresti vedere qualcosa di simile.

inserisci la descrizione dell'immagine qui

Puoi sempre inserire una clausola WHERE per filtrare e visualizzare la descrizione solo per la tua COLLATION .

Puoi trovare un elenco di regole di confronto qui .

Sei interessato alle regole di confronto. Potresti creare qualcosa basato su questo frammento:

 SELECT DATABASEPROPERTYEX('master', 'Collation'); 

Aggiornare
In base alla tua modifica: se @test e @TEST possono mai fare riferimento a due variabili diverse, non è SQL Server. Se vedi problemi dove la stessa variabile non è uguale a se stessa, controlla se quella variabile è NULL , perché NULL = NULL restituisce `false.

Il modo migliore per lavorare con le tabelle già create è che, vai a Sql Server Query Editor

Digitare: sp_help

Questo mostrerà la struttura della tabella, vedere i dettagli per il campo desiderato nella colonna COLLATE.

quindi digita la query come:

 SELECT myColumn FROM myTable WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case' 

Potrebbe essere uno schema di caratteri diverso < SQL_Latin1_General_CP1_CI_AS >, quindi è meglio scoprire lo schema esatto che è stato usato contro quella colonna.

Come posso verificare se un database in SQL Server fa distinzione tra maiuscole e minuscole?

È ansible utilizzare la query seguente che restituisce il database informato con distinzione tra maiuscole e minuscole o che è in ordine binario (con risultato 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')); 

Per maggiori informazioni leggere questo MSDN informazioni ;).

SQL Server non è case sensitive. SELECT * FROM SomeTable è uguale a SeLeCT * frOM soMetaBLe .