2012-06-17 70 views
3

我使用SQL Server 2008 R2。 在我的數據庫存在多索引視圖和多視圖,使用這些索引視圖與提示NOEXPAND。當我通過SSMS得到我的數據庫的腳本(數據庫\任務\生成腳本......),SSMS產品腳本通過以下命令:索引視圖獲取腳本沒有索引

  1. 腳本索引視圖的視圖
  2. 腳本,利用上面的索引視圖
  3. 索引視圖的聚集索引腳本。

當我運行創建的腳本,SQL Server中創建第一個索引視圖沒有聚簇索引,那麼要創建視圖索引視圖與NOEXPAND暗示,這導致引發錯誤。 我該怎麼辦?

SSMS錯誤:hint 'noexpand' on object ..(indexed view).. is invalid.

回答

0

我搜索我的問題,找到解決這個問題的方法。 當您創建一個名爲view1的簡單視圖時,會出現此問題,然後創建另一個視圖名爲view2,然後在view1中使用view2,然後將view2更改爲索引視圖。 爲了解決這個問題,你必須重新創建view1。

10

默認爲腳本的索引是假。您需要將其更改爲true,以便將CREATE INDEX包含在您的視圖中。在Management Studio中:

  • 工具>選項
  • 的SQL Server對象資源管理器
  • 腳本
  • 表和視圖選項>腳本指標

設置選項設置爲True,單擊確定,嘗試再次生成腳本。

編輯

在默認安裝的,上面的設置是我改的嘛。我產生以下模式:

CREATE TABLE dbo.x(i INT); 
GO 
ALTER VIEW dbo.v_x 
WITH SCHEMABINDING 
AS 
    SELECT i, c = COUNT_BIG(*) 
    FROM dbo.x 
    GROUP BY i; 
GO 
CREATE UNIQUE CLUSTERED INDEX i ON dbo.v_x(i); 
GO 
CREATE VIEW dbo.v_y 
AS 
    SELECT i,c FROM dbo.v_x WITH (NOEXPAND); 
GO 

我右鍵單擊的數據庫,任務>生成腳本...挑兩個視圖和表,腳本到一個新的查詢窗口,這是它生產的(我刪除了所有SET選項簡潔,不是因爲他們不存在或不重要):

USE [foo] 
GO 
/****** Object: Table [dbo].[x] Script Date: 06/20/2012 08:03:59 ******/ 
CREATE TABLE [dbo].[x](
    [i] [int] NULL 
) ON [PRIMARY] 
GO 
/****** Object: View [dbo].[v_x] Script Date: 06/20/2012 08:04:00 ******/ 
CREATE VIEW [dbo].[v_x] 
WITH SCHEMABINDING 
AS 
    SELECT i, c = COUNT_BIG(*) 
    FROM dbo.x 
    GROUP BY i; 
GO 
CREATE UNIQUE CLUSTERED INDEX [i] ON [dbo].[v_x] 
(
    [i] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
/****** Object: View [dbo].[v_y] Script Date: 06/20/2012 08:04:00 ******/ 
CREATE VIEW [dbo].[v_y] 
AS 
    SELECT i,c FROM dbo.v_x WITH (NOEXPAND); 
GO 

當我改變了USE [foo]到不同的數據庫,腳本執行就好了(顯然事情是正確的順序)。

因此,無論您是以不同方式生成腳本,還是使用了「錯誤時繼續腳本」選項,並且您的視圖都會阻止創建索引。

+0

我測試這個方法。但SSMS會在創建所有視圖的腳本之後創建索引視圖的集羣索引。如果一個索引視圖在沒有展開提示的另一個視圖上使用,當運行創建的數據庫腳本時,我們會面臨錯誤,您不能使用noexpand提示。 –

+0

這就是整個腳本中的* only *錯誤?恐怕你將不得不張貼腳本和你用來獲取它的方法。我無法複製(更新我的答案以反映這一點)。 –