2016-07-31 56 views
0

我試圖通過執行ALTER VIEW語句來更改存儲在視圖中的列的日期格式,但它不起作用,我不知道爲什麼。SQL Server:視圖或函數包含一個自引用。視圖或函數不能直接或間接引用自己

我的查詢:

ALTER VIEW v_cust_invoices 
AS 
    SELECT 
     FORMAT(INV_DATE,'MM-dd-yy') as INV_DATE 
    FROM 
     v_cust_invoices 

我總是得到錯誤

視圖或函數 'v_cust_invoices' 包含自引用。視圖或函數不能引用自身直接或間接

我試圖改變INV_DATEmm-dd-yy的日期格式(這是目前yy-mm-dd)。有人能幫我嗎?不知道我做錯了什麼。

編輯:如果我做

ALTER VIEW v_cust_invoices 
AS 
    SELECT FORMAT(INV_DATE,'MM-dd-yy') as INV_DATE 
    FROM INVOICE 

相反,它會刪除所有的列,除了INV_DATE

視圖定義:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE VIEW [dbo].[v_cust_invoices] AS 
    SELECT 
     CUSTOMER.CUST_NUM, CUST_LNAME, 
     CUST_BALANCE, INV_NUM, INV_DATE, INV_AMOUNT 
    FROM 
     CUSTOMER, INVOICE 
GO 
+0

刪除並重新創建視圖。在SQL企業管理器中打開它,或將其編寫爲Alter,修改定義中的類型,然後執行它。原始視圖不會引用它,它必須引用其他視圖或表格 –

+0

我不確定我是否理解。一切都很好,我只是有一些錯誤的查詢。 – inaprniac

+0

視圖只能處理和生成* tables *中的數據,這個視圖應該從哪裏獲取數據?在視圖定義中沒有對錶的引用。看起來坐在視圖的* current *定義上,在它的FROM子句中。您將看到對* table *或某個* other *視圖的引用。 –

回答

2

您必須更改查詢,以便它不引用本身。
查看v_cust_invoices視圖的當前定義,其FROM子句。您將看到對錶格或其他視圖的引用。用下面最後一行替換查詢中的最後一行,替換此視圖從中獲取數據的表(或其他視圖)的名稱。

ALTER VIEW v_cust_invoices 
AS 
SELECT FORMAT(INV_DATE,'MM-dd-yy') as INV_DATE, 
    [Plus all the rest of the output columns 
    from CURRENT definition of v_cust_invoices] 
FROM [here Put the table or other view that is in current view definition] 

,或者現在運發佈了完整的視圖定義:

ALTER VIEW [dbo].[v_cust_invoices] AS 
    SELECT FORMAT(INV_DATE,'MM-dd-yy') INV_DATE, 
     CUSTOMER.CUST_NUM, CUST_LNAME, 
     CUST_BALANCE, INV_NUM, INV_DTE, INV_AMOUNT 
    FROM CUSTOMER, INVOICE 
GO 
+0

請參閱編輯,我已經試過了。 – inaprniac

+0

沒關係,這工作,謝謝! – inaprniac

相關問題