Domanda

In particolare, Sql Server 2005 / T-SQL. Ho un campo che è in gran parte una serie di due personaggi, e sono tutti dovuto essere maiuscolo ma c'è un po 'di dati legacy che precede l'attuale DB / System, e ho bisogno di capire quali documenti sono in violazione della tomaia involucro patto.

Ho pensato che questo avrebbe funzionato:

select * from tbl where ascii(field1) <> ascii(upper(field1))

E in effetti mi ha restituito una manciata di record. Hanno da allora sono stati corretti, e ora che query restituisce alcun dato. Ma ho gente che mi dice c'è ancora dati dei casi misti nel DB, e ho appena trovato un esempio:. 'FS' e 'FS' sono entrambi riportare lo stesso valore ASCII

Perché è viziata questo approccio? Che è un modo migliore per andare su questo, o come posso risolvere questo approccio al lavoro correttamente?

È stato utile?

Soluzione

se tutte le informazioni avrebbe dovuto essere in maiuscolo solo fare un aggiornamento

update tbl
set field1 = upper(field1)

, ma per rispondere alla tua domanda originale questa query dovrebbe dare i risultati che ci si aspetta:

select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)

Edit: appena notato che il suggerimento di utilizzare COLLATE è stato pubblicato anche da Ian

Altri suggerimenti

ASCII è il confronto solo la prima lettera. Dovreste confrontare ogni lettera, o modificare le regole di confronto del database per essere maiuscole e minuscole.

È possibile modificare le regole di confronto su un intero livello di database, o solo su una colonna per una query specifica, in modo:

SELECT myColumn 
  FROM myTable  
  WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)

La funzione ascii () restituirà solo il numero ASCII per il primo carattere in un'espressione, se lo si passa una stringa di caratteri multipla. Per fare il confronto che si desidera è necessario guardare a singoli caratteri, non interi campi.

La funzione ASCII () restituisce solo il valore del codice ASCII del carattere più a sinistra di un'espressione di caratteri. Utilizzare UPPER (), invece.

Questo potrebbe funzionare:

select * from tbl 
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))

I metodi descritti in Cassa di ricerca sensibili nelle query SQL Server potrebbe essere utile a voi.

Secondo il documentazione per ASCII() , solo restituisce il carattere più a sinistra.

Credo che stai andando su questo torto. Si potrebbe semplicemente:

select * from tbl where field1 <> upper(field1)

se le regole di confronto sono state impostate correttamente, quindi perché non fissare le regole di confronto ? Se non è possibile modificare in modo permanente, provare:

select * from tbl where
          (field1 collate Latin1_General_CS_AS)
  <> upper(field1 collate Latin1_General_CS_AS)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top