为什么视图中的 Row_Number 给出了一个可为空的列

Why Row_Number in a view gives a nullable column

我有一个使用 CTE 的视图,我想使用一个行号来模拟我在 Visual Studio

中的 edmx 的键
ALTER VIEW [dbo].[ViewLstTypesArticle]
AS
    WITH cte (IdTypeArticle, IdTypeArticleParent, Logo, Libelle, FullLibelle, Racine) AS 
    (
        SELECT        
            f.Id AS IdTypeArticle, NULL AS IdParent, 
            f.Logo, f.Libelle, 
            CAST(f.Libelle AS varchar(MAX)) AS Expr1, 
            f.Id AS Racine
        FROM            
            dbo.ArticleType AS f 
        LEFT OUTER JOIN
            dbo.ArticleTypeParent AS p ON p.IdTypeArticle = f.Id
        WHERE        
            (p.IdTypeArticleParent IS NULL) 
            AND (f.Affichable = 1)

        UNION ALL

        SELECT        
            f.Id AS IdTypeArticle, p.IdTypeArticleParent, 
            f.Logo, f.Libelle, 
            CAST(parent.Libelle + ' / ' + f.Libelle AS varchar(MAX)) AS Expr1, 
            parent.Racine
        FROM            
            dbo.ArticleTypeParent AS p 
        INNER JOIN
            cte AS parent ON p.IdTypeArticleParent = parent.IdTypeArticle 
        INNER JOIN
            dbo.ArticleType AS f ON f.Id = p.IdTypeArticle
    )
    SELECT
        *,
        ROW_NUMBER() OVER (ORDER BY FullLibelle) AS Id 
    FROM
        (SELECT    
             IdTypeArticle, IdTypeArticleParent, Logo, Libelle, 
             FullLibelle, Racine 
         FROM cte) AS CTE1

当我查看列的属性时,我看到 Id bigint ... NULL

并且我的 edmx 排除了这个视图,因为找不到可以用于键的列

当我执行时,我的视图 ID 没有空值。我有我所有的行号。

如果有人遇到这个问题并解决了...谢谢

SQL 服务器通常认为列在视图中是 NULL 可用的(并且在使用 SELECT INTO 时)。

您可以使用 ISNULL():

说服 SQL 服务器事实并非如此
select *,
       ISNULL(ROW_NUMBER() over(ORDER BY FullLibelle), 0) as Id
from . . .

注意:这适用于 ISNULL() 但不适用于 COALESCE(),后者在其他方面具有非常相似的功能。