2013-12-19 34 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