为什么视图中的 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()
,后者在其他方面具有非常相似的功能。
我有一个使用 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()
:
select *,
ISNULL(ROW_NUMBER() over(ORDER BY FullLibelle), 0) as Id
from . . .
注意:这适用于 ISNULL()
但不适用于 COALESCE()
,后者在其他方面具有非常相似的功能。