2012-08-09 12 views
5

मैं निम्नलिखित एसक्यूएल है होना चाहिए:'दृश्य बनाते हैं' बैच में केवल बयान

ALTER PROCEDURE [dbo].[usp_gettasks] 
    @ID varchar(50) 

    AS 
    declare @PDate Date 


    WHILE (DATEPART(DW, @PDate) = 1 OR DATEPART(DW, @PDate) = 7) 
    BEGIN 

     set @PDate = DATEADD(day, 1, @PDate) 

    END 

    CREATE VIEW tblList AS 

    select tt.ItemOrder,tt.DisplayVal, DATEADD(day, tt.DaysDue, @PDate) from tblLine tt 
    where tt.ID = 1 

मैं निम्न संदेश मिलता है:

गलत वाक्य रचना 'दृश्य बनाएँ' होना चाहिए बैच में केवल बयान

मैं Create View से पहले GO डालने की कोशिश की, लेकिन तब यह PDate के मान की पहचान नहीं कर सकते हैं।

+2

आप संग्रहीत प्रक्रिया में विचार क्यों बना रहे हैं? –

उत्तर

10

संग्रहीत प्रक्रिया में दृश्य बनाने के लिए, आपको इसे गतिशील एसक्यूएल में करना होगा (विशेष रूप से जब दृश्य स्वयं एक चर नहीं ले सकता)।

DECLARE @sql NVARCHAR(MAX); 
SET @sql = 'CREATE VIEW dbo.tblList 
    AS 
     SELECT ItemOrder, DisplayVal, 
     SomeAlias = DATEADD(DAY, DaysDue, ''' + CONVERT(CHAR(8), @PDate, 112) 
     + ''') FROM dbo.tblLine WHERE ID = 1;'; 
EXEC sp_executesql @sql; 

लेकिन एक बार आप इस संग्रहीत प्रक्रिया को दूसरी बार कहते हैं, यह विफल, क्योंकि आप dbo.tblList नाम के एक दृश्य बनाने के लिए कोशिश कर रहे हैं जा रहा है और उस दृश्य पहले से मौजूद है। शायद आप "संग्रहीत प्रक्रिया में एक दृश्य बनाना चाहते हैं" की तुलना में उच्च स्तर पर, आप जो कोशिश कर रहे हैं उस पर विस्तार कर सकते हैं।

+1

वह कहकर सृजन से बच सकता है "अगर अस्तित्व में नहीं है (info_schema.columns से चुनें 1 जहां TABLE_NAME = 'tblList') BEGIN बनाएं ... END"। मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन मुझे वही त्रुटि मिलती है जो @NatePet उद्धरण देता है। मुझे पूरी कथन को स्ट्रिंग में रखने की ज़रूरत है? क्यों विपरीत दृश्य ऐसा व्यवहार करता है? –

संबंधित मुद्दे