sql - 为什么视图中的 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 没有空值。我有我所有的行号。
如果有人遇到这个问题并解决它......谢谢
解决方案
SQL Server 通常认为列NULL
在视图中是可用的(以及在使用时SELECT INTO
)。
您可以使用以下命令让 SQL Server 相信情况并非如此ISNULL()
:
select *,
ISNULL(ROW_NUMBER() over(ORDER BY FullLibelle), 0) as Id
from . . .
注意:这适用于ISNULL()
但不适COALESCE()
用于具有非常相似的功能。
推荐阅读
- c# - MVC web API HttpContext.user
- stripe-payments - 如何使用平台的详细信息而不是 Stripe 连接的连接帐户
- python - 如何轻松覆盖python中的路径
- r - 有关正确使用 spark_read_csv 的任何示例吗?
- regex - 如果满足下一行的条件,则 bash 命令删除新行
- git - 保护 Azure Pipeline Yaml 文件不被编辑
- reactjs - 无法读取未定义 Konva.js 的属性“应用”
- product - 为带有远程数据库但在用户计算机上的软件版本命名
- scala - 如何在 gatling 中修改 csv 提要文件
- go - 如何打印传递给 go 程序的所有标志?