2014-05-22 19 views
0

我創建一個存儲過程,如下ERROR在創建視圖中使用if條件

ALTER PROCEDURE [dbo].[spSUPPLIERSOA] 
@CHARTNUMBER1 INT = NULL, 
@CHARTNUMBER2 INT = NULL, 
@ASONDATE DATETIME = NULL 
AS 
BEGIN 
IF OBJECT_id('vwSUPPLIERSOA') IS NOT NULL 
    DROP VIEW vwSUPPLIERSOA 
GO 
CREATE VIEW vwSUPPLIERSOA AS 
    SELECT GLJRNDTL.JOURNALCODE, GLJRNDTL.JOURNALNUM, GLJRNDTL.POSTEDDATE,   APINVHED.CHARACTER01, APINVHED.INVOICENUM, APINVHED.INVOICEDATE, APINVHED.DUEDATE,  
    GLJRNDTL.TRANSAMT, APINVHED.PAYAMOUNTS, APINVHED.DOCPAYAMOUNTS, APINVHED.INVOICEBAL, APINVHED.DOCINVOICEBAL, APINVHED.CURRENCYCODE, APINVHED.EXCHANGERATE 
FROM GLJRNDTL 
LEFT OUTER JOIN APINVHED 
ON APINVHED.INVOICENUM = GLJRNDTL.APINVOICENUM 
WHERE GLJRNDTL.GLCHART BETWEEN @CHARTNUMBER1 AND @CHARTNUMBER2 AND GLJRNDTL.POSTEDDATE < @ASONDATE 


END 

我得到錯誤信息如下

Msg 102, Level 15, State 1, Procedure spSUPPLIERSOA, Line 8 
Incorrect syntax near 'vwSUPPLIERSOA'. 
Msg 137, Level 15, State 2, Procedure vwSUPPLIERSOA, Line 7 
Must declare the scalar variable "@CHARTNUMBER1". 

請讓我知道我得到錯誤的。

+0

從一個存儲過程中創建一個視圖必須使用動態SQL。你確定你需要這樣做 - 是否有理由讓程序改變視圖定義?你是否有更好的服務?一個可以直接接受所需參數的表值函數? –

回答

0

您不能在視圖中使用變量。所以我可以看到你有這些選項:

如果它已經存在,那麼你仍然會放棄視圖。然後我無法真正看到一個觀點。所以你可以這樣做:

ALTER PROCEDURE [dbo].[spSUPPLIERSOA] 
@CHARTNUMBER1 INT = NULL, 
@CHARTNUMBER2 INT = NULL, 
@ASONDATE DATETIME = NULL 
AS 
BEGIN 
SELECT 
    GLJRNDTL.JOURNALCODE, GLJRNDTL.JOURNALNUM, 
    GLJRNDTL.POSTEDDATE, APINVHED.CHARACTER01, 
    APINVHED.INVOICENUM, APINVHED.INVOICEDATE, APINVHED.DUEDATE,  
    GLJRNDTL.TRANSAMT, APINVHED.PAYAMOUNTS, APINVHED.DOCPAYAMOUNTS, 
    APINVHED.INVOICEBAL, APINVHED.DOCINVOICEBAL, APINVHED.CURRENCYCODE, 
    APINVHED.EXCHANGERATE 
FROM GLJRNDTL 
LEFT OUTER JOIN APINVHED 
ON APINVHED.INVOICENUM = GLJRNDTL.APINVOICENUM 
WHERE GLJRNDTL.GLCHART BETWEEN @CHARTNUMBER1 
AND @CHARTNUMBER2 AND GLJRNDTL.POSTEDDATE < @ASONDATE 
END 

另外,你可以創建一個表值函數,你以後可以從中選擇。就像這樣:

CREATE FUNCTION funcSUPPLIERSOA 
(
    @CHARTNUMBER1 INT, 
    @CHARTNUMBER2 INT, 
    @ASONDATE DATETIME 
) 
RETURNS TABLE 
AS 
RETURN 
SELECT 
    GLJRNDTL.JOURNALCODE, GLJRNDTL.JOURNALNUM, 
    GLJRNDTL.POSTEDDATE, APINVHED.CHARACTER01, 
    APINVHED.INVOICENUM, APINVHED.INVOICEDATE, APINVHED.DUEDATE,  
    GLJRNDTL.TRANSAMT, APINVHED.PAYAMOUNTS, APINVHED.DOCPAYAMOUNTS, 
    APINVHED.INVOICEBAL, APINVHED.DOCINVOICEBAL, APINVHED.CURRENCYCODE, 
    APINVHED.EXCHANGERATE 
FROM GLJRNDTL 
LEFT OUTER JOIN APINVHED 
ON APINVHED.INVOICENUM = GLJRNDTL.APINVOICENUM 
WHERE GLJRNDTL.GLCHART BETWEEN @CHARTNUMBER1 AND @CHARTNUMBER2 
AND GLJRNDTL.POSTEDDATE < @ASONDATE 

然後從它像這樣一個存儲過程中進行選擇:

ALTER PROCEDURE [dbo].[spSUPPLIERSOA] 
@CHARTNUMBER1 INT = NULL, 
@CHARTNUMBER2 INT = NULL, 
@ASONDATE DATETIME = NULL 
AS 
SELECT * FROM funcSUPPLIERSOA(@CHARTNUMBER1,@CHARTNUMBER2,@ASONDATE) AS tbl 
相關問題