2013-12-19 31 views
0

我有以下SQL語句,以便我可以使用sp_executesql編寫視圖創建(如果不存在),但由於在最後一個where語句中引用了單引號1,因此語句給了我錯誤。有沒有辦法解決?使用單引號與sp_executesql時出錯

IF NOT EXISTS (SELECT * FROM SYS.objects WHERE NAME = 'vw_JeopardyAlertDetails' AND TYPE = 'V') 
    EXEC sp_executesql @statement = N'CREATE VIEW [dbo].[vw_JeopardyAlertDetails] 
AS 
    SELECT Main.TicketNumber, TS.TicketStateDesc, Main.ApptEnd, ISNULL(C.FirstName, '') AS FirstName, ISNULL(C.LastName, '') AS LastName, ISNULL(Main.CustomerID, '') 
        AS CustomerID, Main.ApptID, Main.ID, Main.TicketType 
    FROM (SELECT s.TicketState, s.TicketID AS ID, s.ApptEnd, dbo.Ticket.TicketNumber, dbo.Ticket.TimeOpened, dbo.Ticket.CreatedBy, dbo.Ticket.ReportedBy, 
            dbo.Ticket.ModifiedBy, dbo.Ticket.ChangedBy, dbo.Ticket.Priority, dbo.Ticket.ServingArea, dbo.Ticket.StructureLink, dbo.Ticket.CustomerID, 
            dbo.Ticket.TicketCategory, dbo.Ticket.TicketCode, s.ApptStart, s.TicketType, s.CanReschedule, ISNULL(s.ID, 0) AS ApptID 
        FROM dbo.Schedule AS s INNER JOIN 
            dbo.Ticket ON s.TicketID = dbo.Ticket.ID 
        WHERE (s.TicketState IN 
             (SELECT DISTINCT TicketState 
             FROM dbo.AlertJeopardyTicketState 
             WHERE (IsJeopardyState = '1'))) AND (s.ApptEnd >= CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111) + ' ' + dbo.GetJeopardyStartTime())) 
            AND (s.ApptEnd <= GETDATE())) AS Main LEFT OUTER JOIN 
        dbo.Customer AS C ON Main.CustomerID = C.ID LEFT OUTER JOIN 
        dbo.TicketStatus AS TS ON Main.TicketState = TS.ID 
    GO' ; 
    ELSE PRINT N'vw_JeopardyAlertDetails ALREADY EXISTS' 
GO 
+1

ü爲什麼要用'sp_executesql'創建視圖,而不是直接指揮? –

回答

4

您需要在Sql @statement中將這些引號加倍,例如,

ISNULL(C.FirstName, '') 

必須

ISNULL(C.FirstName, '''') 

簡體fiddle here

+2

也在連接:',GETDATE(),111)+''+ dbo.GetJeopardyStartTime()))' –

+1

謝謝斯圖爾特和山羊。我在問了幾分鐘後才明白這一點。我一直在盯着屏幕太久。 – ghoston3rd

+0

@Yuriy的問題仍然令人感興趣 - 我將使用動態sql創建視圖的唯一原因是,如果有動態組件,例如如果我想在運行時決定視圖的名稱。這似乎並非如此? – StuartLC