sql server - 2存储过程错误中的左外连接

时间:2013-04-25 05:48:41

标签: sql-server

这就是我创建的存储过程

create procedure p_fetchInspection 
                    @bIsByFreeText bit, @sFreeText nvarchar(max)
                    ,@bIsByTestedDate bit, @dTestedDateFrom datetime, @dTestedDateTo datetime
                    ,@bIsByLocation bit, @sLocation nvarchar(500)
                    ,@bIsByWorkOrder bit, @sWorkOrderFreeText nvarchar(max)
                    ,@bIsByTesterName bit, @sTesterName nvarchar(100)
                    ,@bIsByCorrosionTestingClass bit, @sCorrosionTestingClass nvarchar(10)
                    ,@bIsByTesterReceived bit,@bIsTesterReceived bit
                    ,@bIsByTesterUploaded bit,@bIsTesterUploaded bit
                    ,@bIsByAddedFromDevice bit,@bIsAddedFromDevice bit
                    ,@bIsByChecked bit,@bIsChecked bit
                    ,@bIsByRecordType bit,@bIsDefault bit,@bIsPoleNotSite bit,@bIsNewPole bit
as
BEGIN
--------------------
-- Declare
DECLARE @sSelect nVARCHAR(4000)
DECLARE @sFrom nVARCHAR(4000)
DECLARE @sWhere nVARCHAR(4000)
DECLARE @sOrder nVARCHAR(500)
DECLARE @sSql nVARCHAR(4000)
--------------------
SET @sSelect = 
'
select  
    [WorkOrder] = isnull(c.WorkOrderNo,'''')
    ,[Tester] = a.TesterName
                +
                ''
                ''
                +
                dbo.F_convertToSortableDateAndHourAndMinuteFormat2(a.TestedDate)
    ,[PoleId/Location] = a.PoleId
                        +
                        ''
                        ''
                        +
                        case when a.IsAddFromDevice = 0 then b.ExactDescription else a.LocationNameFromDevice end
    ,[Class] = a.CorrosionTestingClass
    ,[Remarks] = a.Remarks
    ,[IsTesterReceived] = case when a.IsTesterReceived = 1 then ''Yes'' else ''No'' end
    ,[IsTesterUploaded] = case when a.IsTesterUploaded = 1 then ''Yes'' else ''No'' end
    ,[IsAddedFromDevice] = case when a.IsAddFromDevice = 1 then ''Yes'' else ''No'' end
    ,a.SysId
'
SET @sFrom =
'
from 
    t_Inspection a
    left outer join t_asset b on a.AssetObject = b.SysId
    left outer join t_WorkOrder c on d.WorkOrderObject = c.Sysid
'
SET @sWhere = 
'
where 
    a.SysId = d.Sysid
'
------------------------------------------
if @bIsByFreeText = 1
    begin
        SET @sWhere = @sWhere + @sFreeText
    end
------------------------------------------
if @bIsByTestedDate = 1
    begin
        SET @sWhere = @sWhere +
'
    and (DATEDIFF(day, a.TestedDate, @TestedDateFrom) <= 0 
        AND DATEDIFF(day, a.TestedDate, @TestedDateTo) >= 0)
'
    end
------------------------------------------
if @bIsByLocation = 1
    begin
        SET @sWhere = @sWhere +
'
    and b.ExactDescription like ''%'' + @Location + ''%''
'
    end
------------------------------------------
if @bIsByWorkOrder = 1
    begin
        SET @sWhere = @sWhere + @sWorkOrderFreeText 

    end
------------------------------------------
if @bIsByTesterName = 1
    begin
        SET @sWhere = @sWhere +
'
    and a.TesterName like ''%'' + @TesterName + ''%''
'
    end
------------------------------------------
if @bIsByCorrosionTestingClass = 1
    begin
        SET @sWhere = @sWhere +
'
    and a.CorrosionTestingClass = @CorrosionTestingClass
'
    end
------------------------------------------
if @bIsByTesterReceived = 1
    begin
        SET @sWhere = @sWhere +
'
    and a.IsTesterReceived = @IsTesterReceived
'
    end
------------------------------------------
if @bIsByTesterUploaded = 1
    begin
        SET @sWhere = @sWhere +
'
    and a.IsTesterUploaded = @IsTesterUploaded
'
    end
------------------------------------------
if @bIsByAddedFromDevice = 1
    begin
        SET @sWhere = @sWhere +
'
    and a.IsAddFromDevice = @IsAddedFromDevice
'
    end
------------------------------------------
if @bIsByChecked = 1
    if @bIsChecked = 1
    begin
        SET @sWhere = @sWhere +
'
    and a.CheckedBy <> ''''
'
    end
    if @bIsChecked = 0
    begin
        SET @sWhere = @sWhere +
'
    and a.CheckedBy = ''''
'
    end
------------------------------------------
if @bIsByRecordType = 1
begin
    DECLARE @sRecordTypeWhere NVARCHAR(max)
    set @sRecordTypeWhere = ''

    if @bIsDefault = 1
    begin
        SET @sRecordTypeWhere = @sRecordTypeWhere + case when @sRecordTypeWhere = '' then '' else ' or ' end + ' a.isDefault = 1'
    end
    if @bIsPoleNotSite = 1
    begin
        SET @sRecordTypeWhere = @sRecordTypeWhere + case when @sRecordTypeWhere = '' then '' else ' or ' end + ' a.isPoleNotSite = 1'
    end
    if @bIsNewPole = 1
    begin
        SET @sRecordTypeWhere = @sRecordTypeWhere + case when @sRecordTypeWhere = '' then '' else ' or ' end + ' a.isNewPole = 1'
    end

    SET @sWhere = @sWhere + ' and (' + replace(@sRecordTypeWhere, space(2), space(1)) + ')'
end
-----------------------------------------------------------------------
-- Order By Clause
SET @sOrder =
'
order by 
    c.WorkOrderNo
    , b.ExactDescription
    , a.PoleId
'
--------------------
-- Execute SQL
SET @sSql = @sSelect + @sFrom + @sWhere + @sOrder
EXEC sp_executesql 
        @sSql       
        , N'@TestedDateFrom DateTime, @TestedDateTo DateTime, @Location nvarchar(500), @TesterName nvarchar(100), @CorrosionTestingClass nvarchar(10), @IsTesterReceived bit, @IsTesterUploaded bit, @IsAddedFromDevice bit'
        , @TestedDateFrom = @dTestedDateFrom
        , @TestedDateTo = @dTestedDateTo 
        , @Location = @sLocation
        , @TesterName = @sTesterName
        , @CorrosionTestingClass = @sCorrosionTestingClass
        , @IsTesterReceived = @bIsTesterReceived
        , @IsTesterUploaded = @bIsTesterUploaded 
        , @IsAddedFromDevice = @bIsAddedFromDevice
END

但是得到错误“关键字附近的语法不正确'where'”,如果我删除第二个左外连接“d.WorkOrderObject = c.Sysid上的左外连接t_WorkOrder c”那么它可以工作。 如果我在没有存储过程的情况下运行编码,只需在正常查询中运行它,那么也可以工作。 为什么这样?请帮帮我

1 个答案:

答案 0 :(得分:2)

您只需要更改

DECLARE @sFrom nVARCHAR(100) 

DECLARE @sFrom nVARCHAR(500) 

或试试这个 -

CREATE PROCEDURE dbo.p_fetchInspection 

      @bIsByFreeText BIT
    , @sFreeText NVARCHAR(MAX)
    , @bIsByTestedDate BIT
    , @dTestedDateFrom DATETIME
    , @dTestedDateTo DATETIME
    , @bIsByLocation BIT
    , @sLocation NVARCHAR(500)
    , @bIsByWorkOrder BIT
    , @sWorkOrderFreeText NVARCHAR(MAX)
    , @bIsByTesterName BIT
    , @sTesterName NVARCHAR(100)
    , @bIsByCorrosionTestingClass BIT
    , @sCorrosionTestingClass NVARCHAR(10)
    , @bIsByTesterReceived BIT
    , @bIsTesterReceived BIT
    , @bIsByTesterUploaded BIT
    , @bIsTesterUploaded BIT
    , @bIsByAddedFromDevice BIT
    , @bIsAddedFromDevice BIT
    , @bIsByChecked BIT
    , @bIsChecked BIT
    , @bIsByRecordType BIT
    , @bIsDefault BIT
    , @bIsPoleNotSite BIT
    , @bIsNewPole BIT

AS BEGIN

DECLARE 
      @sSelect NVARCHAR(4000)
    , @sFrom NVARCHAR(1000)
    , @sWhere NVARCHAR(4000)
    , @sOrder NVARCHAR(500)
    , @sSql NVARCHAR(4000)

SELECT @sSelect = 
'SELECT 
      WorkOrder = ISNULL(c.WorkOrderNo, '''')
    , Tester = a.TesterName + CHAR(13) + dbo.F_convertToSortableDateAndHourAndMinuteFormat2(a.TestedDate)
    , [PoleId/Location] = a.PoleId + CHAR(13) + CASE WHEN a.IsAddFromDevice = 0 THEN b.ExactDescription ELSE a.LocationNameFromDevice END
    , Class = a.CorrosionTestingClass
    , Remarks = a.Remarks
    , IsTesterReceived = CASE WHEN a.IsTesterReceived = 1 THEN ''Yes'' ELSE ''No'' END
    , IsTesterUploaded = CASE WHEN a.IsTesterUploaded = 1 THEN ''Yes'' ELSE ''No'' END
    , IsAddedFromDevice = CASE WHEN a.IsAddFromDevice = 1 THEN ''Yes'' ELSE ''No'' END
    , a.SysId' + CHAR(13)
, @sFrom =
'FROM dbo.t_Inspection a
LEFT JOIN dbo.t_asset b ON a.AssetObject = b.SysId
LEFT JOIN dbo.t_WorkOrder c ON d.WorkOrderObject = c.Sysid' + CHAR(13)
, @sWhere = 
'WHERE a.SysId = d.Sysid' + CHAR(13)

IF @bIsByFreeText = 1
    SELECT @sWhere = @sWhere + @sFreeText

IF @bIsByTestedDate = 1
    SELECT @sWhere = @sWhere +
'
    AND (
          DATEDIFF(DAY, a.TestedDate, @TestedDateFrom) <= 0 
            AND 
          DATEDIFF(DAY, a.TestedDate, @TestedDateTo) >= 0
        )
'

IF @bIsByLocation = 1
    SELECT @sWhere = @sWhere +
'
    AND b.ExactDescription LIKE ''%'' + @Location + ''%''
'

IF @bIsByWorkOrder = 1
    SELECT @sWhere = @sWhere + @sWorkOrderFreeText 

IF @bIsByTesterName = 1
    SELECT @sWhere = @sWhere +
'
    AND a.TesterName LIKE ''%'' + @TesterName + ''%''
'

IF @bIsByCorrosionTestingClass = 1
    SELECT @sWhere = @sWhere +
'
    AND a.CorrosionTestingClass = @CorrosionTestingClass
'

IF @bIsByTesterReceived = 1
    SELECT @sWhere = @sWhere +
'
    AND a.IsTesterReceived = @IsTesterReceived
'

IF @bIsByTesterUploaded = 1
    SELECT @sWhere = @sWhere +
'
    AND a.IsTesterUploaded = @IsTesterUploaded
'

IF @bIsByAddedFromDevice = 1
    SELECT @sWhere = @sWhere +
'
    AND a.IsAddFromDevice = @IsAddedFromDevice
'

IF @bIsByChecked = 1 BEGIN

    SELECT @sWhere = @sWhere + '
    AND a.CheckedBy ' + 
        CASE WHEN @bIsChecked = 1 
            THEN '!=' 
            ELSE '=' 
        END + ' ''''
    '

END

IF @bIsByRecordType = 1 BEGIN

    DECLARE @sRecordTypeWhere NVARCHAR(MAX)
    SELECT @sRecordTypeWhere = ''

    IF @bIsDefault = 1
        SELECT @sRecordTypeWhere = @sRecordTypeWhere + 
            CASE WHEN @sRecordTypeWhere = '' 
                THEN '' 
                ELSE ' OR ' 
            END + ' a.isDefault = 1'

    IF @bIsPoleNotSite = 1
        SELECT @sRecordTypeWhere = @sRecordTypeWhere + 
            CASE WHEN @sRecordTypeWhere = '' 
                THEN '' 
                ELSE ' OR ' 
            END + ' a.isPoleNotSite = 1'

    IF @bIsNewPole = 1
        SELECT @sRecordTypeWhere = @sRecordTypeWhere + 
            CASE WHEN @sRecordTypeWhere = '' 
                THEN '' 
                ELSE ' OR ' 
            END + ' a.isNewPole = 1'

    SELECT @sWhere = @sWhere + ' AND (' + REPLACE(@sRecordTypeWhere, '  ', ' ') + ')'
END

SELECT @sOrder =
'ORDER BY
      c.WorkOrderNo
    , b.ExactDescription
    , a.PoleId
'

SET @sSql = @sSelect + @sFrom + @sWhere + @sOrder

PRINT @sSql

EXEC sys.sp_executesql 
          @sSql     
        , N'@TestedDateFrom DateTime, @TestedDateTo DateTime, @Location nvarchar(500), @TesterName nvarchar(100), @CorrosionTestingClass nvarchar(10), @IsTesterReceived bit, @IsTesterUploaded bit, @IsAddedFromDevice bit'
        , @TestedDateFrom = @dTestedDateFrom
        , @TestedDateTo = @dTestedDateTo 
        , @Location = @sLocation
        , @TesterName = @sTesterName
        , @CorrosionTestingClass = @sCorrosionTestingClass
        , @IsTesterReceived = @bIsTesterReceived
        , @IsTesterUploaded = @bIsTesterUploaded 
        , @IsAddedFromDevice = @bIsAddedFromDevice

END