una tablas tabla relacionar referencial primary para integridad foreign ejemplos crear constraint como columna codigo agregar sql tsql view entities

tablas - integridad referencial sql server



¿Cómo se indican las columnas como NOT NULL en una vista? (4)

Estoy tratando de usar una vista para crear una entidad ADO.NET utilizando una vista. Sin embargo, esa vista no tiene una sola columna que NO ES NULA.

Una cosa que se me ocurrió fue crear una columna NOT NULL en la vista para usarla como ''clave principal'' para la vista. Esto funcionó, pero el campo todavía se informa como NULL.

¿Hay alguna manera de forzar o engañar a SQL Server para que informe esa columna de vista como NOT NULL?

Imagine la vista como algo así como:

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

Nota: Antes de decir que puedo editar el XML de la entidad para hacer tal cosa, estoy preguntando esto porque tengo un número MUY grande de entidades para ser creadas de esta manera.


Use newid ()

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


En primer lugar, para responder a su pregunta:

No desea usar newid() para determinar su campo de id, ya que esto se volverá a calcular cada vez que use la vista. Realmente, la integridad de los datos es el mayor problema.

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

Esto solo funciona si ordena en un campo que tendrá un pedido consistente que agregará nuevas filas, como un campo CreateDate . Si no tiene esto, esa identificación está sujeta a cambios. Ahora, si solo necesita estos ID en tiempo de ejecución, y no hay nada que los vincule de forma permanente, row_number será solo afilado. Si tiene datos no confiables, no hay forma de tener un campo de ID confiable a menos que cree una tabla adicional y use activadores para completarla.

En segundo lugar, tenga cuidado con eso with schemabinding . Es peligroso si se usa como kludge. Recuerde que tan pronto como cree una vista with schemabinding , no podrá alterar el esquema de ninguna tabla subyacente. Esto significa que no puede hacer que una columna varchar(50) varchar(100) sin descartar y volver a agregar todas las vistas que tengan activado el with schemabinding . Sí, puede indexar una vista que está vinculada al esquema, pero definitivamente hay compensaciones que deben tenerse en cuenta antes de pasar al bloqueo, stock y barril.


No sé si vale la pena el esfuerzo, pero creo que crear una función que devuelva tablas temporales con campos NOT NULL debería funcionar para el valor calculado. 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

y luego selecciona esa función en la vista.

Aclamaciones.


ISNULL para esto. Es decir algo como lo siguiente funcionó para mí:

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