【问题标题】:Is this a SQL Server Management Studio bug?这是 SQL Server Management Studio 错误吗?
【发布时间】:2014-10-13 19:04:20
【问题描述】:

我因此创建了一个 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 子句吗?

谢谢,戴夫

【问题讨论】:

  • 您的问题是什么?这听起来更像是一个错误报告而不是一个问题。如果您想向 Microsoft 报告错误,请在 connect site 上报告。
  • 显然我的问题是 - 这是正常的还是错误的?
  • 视图中的前 100% 毫无意义。您的视图的输出不保证按该顺序排列。如果您希望数据按特定顺序排列,则必须在检索它的查询中对其进行排序。考虑一下如果您有两个视图并且它们的子句顺序冲突,那么顺序会是什么。哪一个会“赢”。如果您想订购,则只有一种方法可以确保订单,即 order by 子句。
  • 比使用糟糕的视觉设计器更好的选择是使用 t-sql。 :)
  • 停止“设计”视图。设计师太可怕了。右键单击,脚本视图为,更改为,新的查询编辑器窗口。

标签: tsql common-table-expression sql-view ssms-2012


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据MSDN

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

    所以在我看来,您在 SQL Server Management Studio 设计器中发现了一个错误。 Another post 表示 SQL Server 2008 R2 中也发生了同样的问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2020-05-02
      相关资源
      最近更新 更多