Opzione "Null" nelle colonne restituite da una vista.

venerdì 25 settembre 2009 - 13.52

fantoccino Profilo | Newbie

Salve a tutto l'NG.
Avevo gia un tread aperto ma poi con Alessandro si siamo incartati e preferisco farne uno nuovo con il nocciolo della domanda senza entrare in altri aspetti.

In SQL SERVER 2000 ho una tabella con un campo ANCODICE tipo "int" proprietà "Not Null".

Ho la necessità di creare una vista che interrogando questa tabella mi restituisca il campo ANCODICE però "Char" e sempre "Not Null".

Utilizzando CAST/CONVERT riesco ovviamentea convertire il campo da int a char ma la sua proprietà passa da "Not Null" a "Null" e questo purtroppo crea problemi ad un applicativo installato in un palmare con SQL SERVER CE che appunto utilizza questa vista.

Esiste la possibilita con una vista di castare un campo lasciando inalterata la sua proprieta "not null"?
Grazie.
Rombino Cadino

lbenaglia Profilo | Guru

>Utilizzando CAST/CONVERT riesco ovviamentea convertire il campo
>da int a char ma la sua proprietà passa da "Not Null" a "Null"
>e questo purtroppo crea problemi ad un applicativo installato
>in un palmare con SQL SERVER CE che appunto utilizza questa vista.

Ciao Roberto,

Detto così è impossibile
L'unica spiegazione è che nella query esegui una outer join e non esistono valori per la colonna castata, quindi è ovvio che gli venga attribuito il (non) valore NULL.
In questo caso applica ad esempio la funzione COALESCE per assegnare un valore esplicito nel caso in cui non sia conosciuto.

>Esiste la possibilita con una vista di castare un campo lasciando
>inalterata la sua proprieta "not null"?
Si, e non è possibile fare il contrario.

>Grazie.
Prego.

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

fantoccino Profilo | Newbie

>Detto così è impossibile
>L'unica spiegazione è che nella query esegui una outer join e
>non esistono valori per la colonna castata, quindi è ovvio che
>gli venga attribuito il (non) valore NULL.
>In questo caso applica ad esempio la funzione COALESCE per assegnare
>un valore esplicito nel caso in cui non sia conosciuto.

Eppure ecco la vista
SELECT CONVERT(char(6), CodCliFor) AS ANCODICE FROM dbo.ClientiFornitori

proprietà della colonna ANCODICE della vista come riportata da Management Studio
dbo.ce_clienti
Colonne
ANCODICE (char(6),Null)

proprietà della colonna ANCODICE della tabella ClientiFornitori
dbo.ClientiFornitori
Colonne
CodCliFor(Chiave primaria, int, Non Null)

Ci sono ovviamente altri campi secondari che ho omesso. Quando il palmare rtramite SQL SERVER CE 2.0 utilizza la vista ce_clienti ritorna un errore perchè non può indicizzare un campo con proprietà null come chiave primaria.

Grazie.
Rombino Cadino

lbenaglia Profilo | Guru

>>Detto così è impossibile
>>L'unica spiegazione è che nella query esegui una outer join e
>>non esistono valori per la colonna castata, quindi è ovvio che
>>gli venga attribuito il (non) valore NULL.
>>In questo caso applica ad esempio la funzione COALESCE per assegnare
>>un valore esplicito nel caso in cui non sia conosciuto.
>
>Eppure ecco la vista
>SELECT CONVERT(char(6), CodCliFor) AS ANCODICE FROM dbo.ClientiFornitori
>
>proprietà della colonna ANCODICE della vista come riportata da
>Management Studio
>dbo.ce_clienti
> Colonne
> ANCODICE (char(6),Null)
>
>proprietà della colonna ANCODICE della tabella ClientiFornitori
>dbo.ClientiFornitori
> Colonne
> CodCliFor(Chiave primaria, int, Non Null)

Vediamo...

USE tempdb; CREATE TABLE dbo.foo( c1 int NOT NULL ); GO CREATE VIEW dbo.v_foo AS SELECT c1 FROM dbo.foo; GO CREATE VIEW dbo.v_foo_cast AS SELECT CONVERT(char(6), c1) AS c1_string FROM dbo.foo; GO SELECT OBJECT_NAME(object_id) AS object, name, is_nullable FROM sys.columns WHERE object_id IN( OBJECT_ID('dbo.foo') , OBJECT_ID('dbo.v_foo') , OBJECT_ID('dbo.v_foo_cast') ); /* Output: object name is_nullable ------------ ----------- ----------- foo c1 0 v_foo c1 0 v_foo_cast c1_string 1 (3 row(s) affected) */ DROP VIEW dbo.v_foo, dbo.v_foo_cast; DROP TABLE dbo.foo;

E' vero, se applichi la fuinzione CONVERT per castare la colonna perdi la nullability, ma io mi chiedo: se la vista non fa altro che accedere alla base table che ha la colonna definita come NOT NULL come può restituire un eventuale valore NULL?

>Ci sono ovviamente altri campi secondari che ho omesso. Quando
>il palmare rtramite SQL SERVER CE 2.0 utilizza la vista ce_clienti
>ritorna un errore perchè non può indicizzare un campo con proprietà
>null come chiave primaria.
In che senso "non può indicizzare un campo"?
Puoi spiegarti meglio?
La vista è materializzata?

>Grazie.
Prego.

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

fantoccino Profilo | Newbie

>E' vero, se applichi la fuinzione CONVERT per castare la colonna
>perdi la nullability, ma io mi chiedo: se la vista non fa altro
>che accedere alla base table che ha la colonna definita come
>NOT NULL come può restituire un eventuale valore NULL?

In effetti non mi restituisce un valore NULL perchè ovviamente nella tabella sottostante non ci può essere. Il problemà è che perdendo la nullability
mi crea problemi al programma VB contenuto nel palmare che utilizza questa vista (programma che non posso toccare e di cui non ho i sorgenti)

In pratica il palmare utilizza questa vista per popolare il suo DB interno SDF, esegue la vista e poi una operazione di indicizzazione dei dati ottenuti; in questa fase ritorna un errore perchè il campo ANCODICE deve essere NOT NULL per essere utilizzato come chiave primaria.
Probabilmente utilizzerà la vista per creare una tabella interna ereditando le proprietà dei campi e poi tentando di creare l'indice primario ritorna questo errore. Onestamente non so come questo programma vb lavori, io vedo soltanto i messaggi a video che mi danno la sequanze delle varie fasi in corso (prima esecuzione della vista poi indicizzazione).
So soltanto che se il campo ANCODICE è NOT NULL funziona, se è NULL ritorna un errore.
Se puo servire ho il db SDF interno del palmare.

La spiegazione iniziale qui :
http://www.dotnethell.it/forum/messages.aspx?ThreadID=32441

>La vista è materializzata?
La vista non è indicizzata. Creando una vista indicizzata potrei forse risolvere il problema riuscendo a restituire il campo ANCODICE con proprietà NON NULL ??

>Ciao!
Ciao e te e mille grazie ovviamente.
Rombino Cadino

lbenaglia Profilo | Guru

>In pratica il palmare utilizza questa vista per popolare il suo
>DB interno SDF, esegue la vista e poi una operazione di indicizzazione
>dei dati ottenuti;
Se la vista non è materializzata non contiene alcun dato ma accede direttamente alla data pages della tabella sottostante, quindi non capisco cosa intendi con "indicizzazione dei dati ottenuti".

>Probabilmente utilizzerà la vista per creare una tabella interna
>ereditando le proprietà dei campi e poi tentando di creare l'indice
>primario ritorna questo errore. Onestamente non so come questo
>programma vb lavori, io vedo soltanto i messaggi a video che
>mi danno la sequanze delle varie fasi in corso (prima esecuzione
>della vista poi indicizzazione).
>So soltanto che se il campo ANCODICE è NOT NULL funziona, se
>è NULL ritorna un errore.
Non ho mai utilizzato SQL CE ma se supporta le user-defined function potresti definirne una come nel seguente esempio:

USE tempdb; CREATE TABLE dbo.foo( c1 int NOT NULL ); GO CREATE VIEW dbo.v_foo AS SELECT c1 FROM dbo.foo; GO CREATE VIEW dbo.v_foo_cast AS SELECT CONVERT(char(6), c1) AS c1_string FROM dbo.foo; GO CREATE FUNCTION dbo.udf_foo_cast() RETURNS @t TABLE( c1_string char(6) NOT NULL ) AS BEGIN INSERT @t SELECT CONVERT(char(6), c1) FROM dbo.foo RETURN END; GO SELECT OBJECT_NAME(object_id) AS object, name, is_nullable FROM sys.columns WHERE object_id IN( OBJECT_ID('dbo.foo') , OBJECT_ID('dbo.v_foo') , OBJECT_ID('dbo.v_foo_cast') , OBJECT_ID('dbo.udf_foo_cast') ); /* Output: object name is_nullable ------------ ----------- ----------- foo c1 0 v_foo c1 0 v_foo_cast c1_string 1 udf_foo_cast c1_string 0 (4 row(s) affected) */ DROP VIEW dbo.v_foo, dbo.v_foo_cast; DROP FUNCTION dbo.udf_foo_cast; DROP TABLE dbo.foo;

>Ciao e te e mille grazie ovviamente.
Prego.

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

fantoccino Profilo | Newbie

>Se la vista non è materializzata non contiene alcun dato ma accede direttamente
>alla data pages della tabella sottostante, quindi
>non capisco cosa intendi con "indicizzazione dei dati ottenuti".
Dunque considera che SQL CE si collega a SQL SERVER 2000 tramite activesync e tramite un agente interroga tabelle e/o viste per ottenere
dati con cui popolare il proprio db interno in formato SDF.
La vista non è materializzata. Nel video del palmare compare "Acquisizione Clienti" a viene eseguita vista di cui stiamo parlando.
Eseguita la vista (per popolare il proprio DB interno), compare "Indicizzazione" e qui compare l'errore o no a seconda se la vista restituisce un campo con proprietà NULL o no.
Io non posso intervenire nel palmare. Posso solo cercare di creare una vista che restituisca il campo ANCODICE con proprietà NOT NULL.

>Non ho mai utilizzato SQL CE ma se supporta le user-defined function
>potresti definirne una come nel seguente esempio:
scusami ma qui sono carente. Posso creare una funzione in SQL Server 2000 che abbia il nome della vista (che a questo punto scompare),
interroghi la tabella e restituisca la colonna con proprieta NOT NULL?

Grazie.
Rombino Cadino

lbenaglia Profilo | Guru

>scusami ma qui sono carente. Posso creare una funzione in SQL
>Server 2000 che abbia il nome della vista (che a questo punto
>scompare),
>interroghi la tabella e restituisca la colonna con proprieta
>NOT NULL?
Si, elimina la vista e definisci una UDF table-valued multistatement che abbia lo stesso nome della vista.

>Grazie.
Prego.

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

fantoccino Profilo | Newbie

>Si, elimina la vista e definisci una UDF table-valued multistatement
>che abbia lo stesso nome della vista.
Dunque problema risolto. Un enorme grazie alla dritta di Lorenzo nel creare una UDF che restituisse i
campi castati con le proprietà desiderate (ANCODICE char NOT NULL oltre agli altri).

In primis ho creato l'UDF con lo stesso nome della vista ma in questo modo
non funzionava perchè il palmare restituiva una errore di mancato passaggio
di parametri alla funzione: in pratica mancavano le parentesi nella chiamata!!!
Quindi ho creato una nuova vista (la definitiva) con una banale
SELECT * FROM ce_clienti_UDF()
che mi ha restituito le colonne desiderate !!! BINGO !!!

Grazie di nuovo e saluti al forum !
Rombino Cadino
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