2

我因此创建了一个 SQL Server 2012 Enterprise 视图 -

CREATE VIEW [dbo].[vTest]
AS
WITH cte_LCH AS
(
    select *, Rank = ROW_NUMBER() OVER (PARTITION BY ClaimId ORDER BY Id DESC)
    from ClaimHistories
    where Status in (1,2)
)
    SELECT TOP (100) PERCENT dbo.Claims.Id AS ClaimId, cte_LCH.Id AS ClaimHistoryId, 
           dbo.Claims.PlanId, dbo.Providers.ChainId, dbo.Claims.MemberId
     FROM  dbo.TxDetails RIGHT OUTER JOIN
           cte_LCH ON dbo.TxDetails.Id = cte_LCH.TxDetailId LEFT OUTER JOIN
           dbo.ClaimHistoryPrices ON cte_LCH.Id = dbo.ClaimHistoryPrices.ClaimHistoryId RIGHT OUTER JOIN
           dbo.Claims INNER JOIN
           dbo.Providers ON dbo.Claims.ProviderId = dbo.Providers.Id INNER JOIN
           dbo.Members ON dbo.Claims.MemberId = dbo.Members.Id ON cte_LCH.ClaimId = dbo.Claims.Id
     WHERE cte_LCH.Rank = 1
     ORDER BY ClaimId

但是当我要求 SSMS“设计”保存的视图时,它只显示了这个 -

SELECT *, Rank = ROW_NUMBER() OVER (PARTITION BY ClaimId
ORDER BY Id DESC)
FROM      ClaimHistories
WHERE     Status IN (1, 2))
    SELECT     TOP (100) PERCENT dbo.Claims.Id AS ClaimId, cte_LCH.Id AS ClaimHistoryId, dbo.Claims.PlanId, dbo.Providers.ChainId, dbo.Claims.MemberId
     FROM dbo.TxDetails RIGHT OUTER JOIN
          cte_LCH ON dbo.TxDetails.Id = cte_LCH.TxDetailId LEFT OUTER JOIN
          dbo.ClaimHistoryPrices ON cte_LCH.Id = dbo.ClaimHistoryPrices.ClaimHistoryId RIGHT OUTER JOIN
          dbo.Claims INNER JOIN
          dbo.Providers ON dbo.Claims.ProviderId = dbo.Providers.Id INNER JOIN
          dbo.Members ON dbo.Claims.MemberId = dbo.Members.Id ON cte_LCH.ClaimId = dbo.Claims.Id
     WHERE cte_LCH.Rank = 1
     ORDER BY ClaimId

并且没有显示“WITH”子句,所以实际上我无法实际编辑和保存视图,因为额外的 ')' 字符导致语法错误,如果我复制,它不是可执行代码。但是,如果我将视图编写到查询窗口中,我会在创建时获得原始代码。然而,CTE 的观点似乎运作良好。

我的问题是——这正常吗?可以在这样的视图中使用 CTE 吗?如果我要求 SSMS 设计保存的视图,我应该看到 WITH 子句吗?

谢谢,戴夫

4

2 回答 2

1

View 中的 TOP 100 PERCENT ORDER BY 在 SQL Server 2012 中有效,在 SQL Server 2014 中无效 - 我将其归类为 BUG,无论其他人的设计选择如何 :)

于 2014-10-21T22:55:47.427 回答
1

根据MSDN

CTE 也可以在 CREATE VIEW 语句中指定为视图的定义 SELECT 语句的一部分。

所以在我看来,您在 SQL Server Management Studio 设计器中发现了一个错误。 另一篇文章说同样的问题发生在 SQL Server 2008 R2 中。

( TechNet上的另一个参考资料对使用 CTE 创建视图也有同样的看法。)

于 2014-10-21T23:08:28.507 回答