首页 > 解决方案 > 为什么视图中的 Row_Number 给出一个可为空的列

问题描述

我有一个使用 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 没有空值。我有我所有的行号。

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

标签: sqlsql-servertsqlviewrow-number

解决方案


SQL Server 通常认为列NULL在视图中是可用的(以及在使用时SELECT INTO)。

您可以使用以下命令让 SQL Server 相信情况并非如此ISNULL()

select *,
       ISNULL(ROW_NUMBER() over(ORDER BY FullLibelle), 0) as Id
from . . .

注意:这适用于ISNULL()但不适COALESCE()用于具有非常相似的功能。


推荐阅读