Ordinamento dati in SQL Server 2005

lunedì 21 luglio 2008 - 22.26

danpres Profilo | Newbie

Salve a tutti,
innanzitutto complimenti a tutto il gruppo,nn scrivo spesso, ma vi leggo tantissimo.

Mi sto riavvicinando a sql server 2005 ma riscontro alcuni problemi che da niubbo non riesco a risolvere.

Un pò di anni fa, quando c'era da decidere quale database utilizzare per lo sviluppo di un software gestionale, dopo varie prove non andate a buon fine,decisi di nn utilizzare sql server.
In quel periodo in effetti non avevo bisogno di un db client/server, e siccome l'ambiente di sviluppo scelto all'epoca dava la possibilità di utilizzare un database abbastanza valido non mi preoccupai più di tanto. Utilizzai Microsoft Visual FoxPro.
Ora però i miei clienti hanno sempre più bisogno di tabelle corpose con la presenza di numerosi record, hanno bisogno di maggiore sicurezza e quindi mi sto ricimentando con sql server.

I problemi da niubbo sono due:
1-problema legato all'ordinamento dei dati in presenza di trattini "-";
2-problema legato alle chiavi esterne per le relazioni tra tabelle (ho aperto un'altra discussione);

veniamo finalmente al dunque:
ho una tabella "Articoli" con il normalissimo campo "CodArticolo".
Ci sono 4 record inseriti con i seg codici:
ART-01
ART-02
ART01
ART02

alla banalissima query SELECT CodArticolo FROM Articoli ORDER BY CodArticolo i dati vengono prelevati dal db e visualizzati in questo ordine:
ART01
ART-01
ART02
ART-02

Ovviamente l'ordinamento che mi sembra più giusto è quello che ho scritto io prima, in quanto in Visual Studio.NET 2008, è vera la condizione "ART-01"<"ART01" quindi "ART-01" dovrebbe trovarsi prima di "ART01".

Ho letto sull'help che dovrebbe dipendere dalle opzioni sul database, cioè dalla proprietà "Regole di confronto" che ho prontamente impostato su "Latin1_General_BIN", ma nn cambia nulla.

Per far capire il problema, potete eseguire questo banalissimo codice in un pulsante di un nuovo form che utilizza un datacontext di linq2sql:

Dim mydc As New myDBDataContext
Dim myqry = From Articoli In mydc.Articoli _
Order By Articoli.CodArticolo _
Select Articoli

Dim lc_prec As String = ""

For Each r In myqry

If lc_prec <> r.CodArticolo Then
If lc_prec > r.CodArticolo Then
MsgBox(r.CodArticolo)
End If
lc_prec = r.CodArticolo
End If

Next

In poche parole, il messaggio non dovrebbe comparire mai, ma si verifica 2 volte.

qualcuno mi sa aiutare??
grazie in anticipo

lbenaglia Profilo | Guru

>Ho letto sull'help che dovrebbe dipendere dalle opzioni sul database,
>cioè dalla proprietà "Regole di confronto" che ho prontamente
>impostato su "Latin1_General_BIN", ma nn cambia nulla.

A me cambia eccome:

USE tempdb; CREATE TABLE dbo.Articoli( CodArticolo varchar(6) COLLATE Latin1_General_CI_AS NOT NULL, CONSTRAINT PK_Articoli PRIMARY KEY(CodArticolo) ); INSERT dbo.Articoli VALUES('ART-01'); INSERT dbo.Articoli VALUES('ART-02'); INSERT dbo.Articoli VALUES('ART01'); INSERT dbo.Articoli VALUES('ART02'); SELECT * FROM dbo.Articoli ORDER BY CodArticolo; /* Output: CodArticolo ----------- ART01 ART-01 ART02 ART-02 (4 row(s) affected) */ ALTER TABLE dbo.Articoli DROP CONSTRAINT PK_Articoli; ALTER TABLE dbo.Articoli ALTER COLUMN CodArticolo varchar(6) COLLATE Latin1_General_BIN NOT NULL; ALTER TABLE dbo.Articoli ADD CONSTRAINT PK_Articoli PRIMARY KEY(CodArticolo); SELECT * FROM dbo.Articoli ORDER BY CodArticolo; /* Output: CodArticolo ----------- ART-01 ART-02 ART01 ART02 (4 row(s) affected) */ DROP TABLE dbo.Articoli;

>grazie in anticipo
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

danpres Profilo | Newbie

grazie 1000!

in effetti il tuo script funziona perfettamente.

Dopo la modifica alle opzioni del database, pensavo che non ci fosse bisogno di modificare anche la tabella.

Dal tuo script, giustamente, si capisce che il campo (e non la tabella) ha la proprietà "Regola di confronto" che non viene aggiornata dopo la modifica al db.

grazie ancora!

PS: Per la tua indubbia esperienza, conviene impostare il Latin1_General_BIN ?!?!

lbenaglia Profilo | Guru

>Dopo la modifica alle opzioni del database, pensavo che non ci
>fosse bisogno di modificare anche la tabella.
Hai modificato la collation di default a livello di database?
In questo caso ogni nuova CREATE TABLE/ALTER TABLE...ALTER COLUMN utilizzerà la nuova collation per tutte le colonne stringa se non diversamente specificato.
Le colonne stringa in essere manterranno la collation originaria.

>Dal tuo script, giustamente, si capisce che il campo (e non la
>tabella) ha la proprietà "Regola di confronto" che non viene
>aggiornata dopo la modifica al db.
Le collation si possono impostare a livello di istanza, database o singola colonna.
Non esiste una impostazione a livello di tabella.

>grazie ancora!
Prego.

>PS: Per la tua indubbia esperienza, conviene impostare il Latin1_General_BIN
>?!?!
Se ti serve, si

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5