tenho uma tabela:
CREATE TABLE [dbo].[Realty](
[Id] [int] IDENTITY(1,1) NOT NULL,
[RankingBonus] [int] NOT NULL,
[Ranking] AS ([Id]+[RankingBonus]) PERSISTED NOT NULL
....
)
E uma vista:
CREATE View [dbo].[FilteredRealty] AS
SELECT
realty.Id as realtyId,
...
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.Ranking,
...
FROM realty
JOIN Category ON realty.CategoryId = Category.Id
LEFT JOIN ruian_cobce ON realty.cobceId = ruian_cobce.cobce_kod
LEFT JOIN ruian_obec ON realty.obecId = ruian_obec.obec_kod
LEFT JOIN okres ON realty.okresId = okres.okres_kod
LEFT JOIN ExternFile ON realty.Id = ExternFile.ForeignId AND ExternFile.IsMain = 1
AND ExternFile.ForeignTable = 5
INNER JOIN Person ON realty.OwnerId = Person.Id
WHERE Person.ConfirmStatus = 1
Eu tenho um modelo dbml em C# (LinqToSQL) com a exibição FilteredRealty nele. O campo [Ranking] é reconhecido como um int anulável e, portanto, tenho que corrigir o tipo no código gerado toda vez que altero algo no banco de dados. Isso é muito frustrante para mim e muito trabalho manual.
Não há agregações usadas no FilteredRealty (em relação a esta questão relacionada ).
Por que a coluna Classificação da exibição é considerada anulável se Realty.Ranking não for anulável?
O
[Ranking]
campo está sendo exibido como "Nullable" por ser uma coluna computada. Sim, é declarado comoNOT NULL
, mas como afirma a página MSDN para Computed Columns , o mecanismo de banco de dados pode alterar essa determinação no momento da consulta:Então, vamos ver se isso é verdade:
Agora vamos ver se o conselho deles
ISNULL
funciona:O conselho deles parece preciso, então vamos tentar aplicá-lo à definição da coluna computada:
E agora verificamos as propriedades novamente, mas para o novo campo:
Isso parece positivo até agora, mas mesmo a definição original relatou "NÃO NULO" nessas duas verificações. Então, vamos tentar o teste real -- como o mecanismo de banco de dados determina a nulidade em tempo de execução:
Para garantir que a expressão da coluna computada de classificação não retorne NULL em nenhuma circunstância, você deve envolvê-la
ISNULL
com um valor padrão adequado. Por exemplo:A
NOT NULL
restrição garante que o valor persistente não seja nulo, no contexto das configurações de tabela e nível de sessão em vigor quando a tabela é modificada.No entanto, quando uma consulta faz referência a essa expressão, o SQL Server pode escolher entre usar o valor persistente (se as configurações corresponderem) ou computar a expressão novamente.
Algumas configurações de sessão podem fazer com que um estouro retorne NULL, por exemplo, portanto, o SQL Server deve considerar essa possibilidade. Quando acessado por meio da exibição, o SQL Server marca corretamente a coluna como potencialmente retornando um NULL.
Usar um extremo
ISNULL
na expressão é a única maneira com suporte de obter o que você deseja. UsarCOALESCE
não vai funcionar, por exemplo.Demonstração:
Observe o uso de
sys.sp_refreshsqlmodule
porque sua exibição não é delimitada pelo esquema.