2009-08-15 16 views
7

Sto tentando di utilizzare una vista per creare un'entità ADO.NET utilizzando una vista. Tuttavia, quella vista non ha una singola colonna che NON sia NULL.Come indicare una colonna come NOT NULL in una vista?

Una cosa che mi è venuta in mente è stata creare una colonna NOT NULL sulla vista da usare come "chiave primaria" per la vista. Questo ha funzionato, ma il campo è ancora segnalato come NULL.

C'è un modo per forzare o ingannare SQL Server a segnalare tale colonna come NOT NULL?

Immaginate la vista come qualcosa di simile:

CREATE VIEW vwSample WITH SCHEMABINDING 
AS 
SELECT ID = convert(uniqueidentifier, /* some computed value */) 
     ,Field1 
     ,Field2 
     ,Field3 
    FROM tbSample 

Nota:Prima di dire che posso modificare il codice XML entità di fare cosa del genere, mi sto chiedendo perché ho un MOLTO numero elevato di entità da creare in questo modo.

+0

aggiungere la chiave primaria sequenziale alla vista? –

+0

Quale versione di SQL Server? –

+0

Se i dati non sono naturalmente identificabili, perché dovresti aggiungere una chiave primaria? Dubito che vorresti aderire usando questa falsa chiave primaria ... – pjp

risposta

3

Non so se vale la pena lo sforzo, ma credo che la creazione di una funzione che restituisce tabella temporanea con NOT NULL campi dovrebbe funzionare per il valore calcolato. ex.

Create function fnSTestample() 
returns @Test TABLE 
(
    tableId varchar(100) not null 
) 
WITH SCHEMABINDING 
as 
begin 
    insert @Test(tableID) 
    select 'some computed value' from dbo.someTable 
return 
end 

e quindi si seleziona tale funzione nella vista.

Cheers.

+0

Per quanto riguarda il mio requisito, questo approccio fa miracoli. –

0

Usa newid()

CREATE VIEW vwSample WITH SCHEMABINDING 
AS 
SELECT ID = NEWID() 
     ,Field1 
     ,Field2 
     ,Field3 
    FROM tbSample 
+0

scusate, non è stato corretto –

4

In primo luogo, per rispondere alla tua domanda:

Se non si desidera utilizzare newid() per determinare il campo id, dal momento che questo sarà ricalcolato ogni volta che si utilizza la visualizzazione. In realtà, l'integrità dei dati è il problema più grande.

select 
    row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID, 
    Field1, 
    Field2, 
    Field3 
from 
    tblA 
order by 
    someStaticAndUniqueFieldLikeCreateDate 

Questo funziona solo se si ordinano su un campo che avrà un ordinamento coerente che aggiungerà nuove righe, come ad esempio un campo CreateDate. Se non si dispone di questo, tale ID è soggetto a modifiche. Ora, se hai solo bisogno di questi ID in fase di runtime e non c'è nulla che li colleghi in modo permanente, lo row_number sarà semplicemente appassionato. Se si dispone di dati non affidabili, non è possibile avere un campo ID affidabile a meno che non sia creare una tabella aggiuntiva e utilizzare i trigger per popolare.

In secondo luogo, fare attenzione con quello with schemabinding. È pericoloso se usato come kludge. Ricordare che non appena si crea una vista with schemabinding, non è possibile modificare lo schema di qualsiasi tabella sottostante in tutto. Ciò significa che non è possibile creare una colonna varchar(50) a varchar(100) senza eliminare e aggiungere nuovamente tutte le viste che hanno abilitato with schemabinding. Sì, puoi indicizzare una vista che è schematica, ma ci sono sicuramente dei compromessi che devono essere presi in considerazione prima di andare in blocco, in serie e a botte.

1

Ho usato ISNULL per questo. Cioèqualcosa del genere ha funzionato per me:

CREATE VIEW vwSample WITH SCHEMABINDING 
AS 
SELECT ID = ISNULL(uniqueidentifier, /*some computed value */) 
     ,Field1 
     ,Field2 
     ,Field3 
    FROM tbSample 
Problemi correlati