David Cleeton Ответов: 1

Хранимая процедура Sql возвращает синтаксическую ошибку при использовании условного предложения where


У меня есть следующая хранимая процедура, которая принимает 2 параметра. Параметр @Class может иметь любое из 11 значений. В зависимости от значения предложение where смотрит на другой столбец.

Процедура компилируется нормально, и если я копирую печать и вставляю ее в новое окно запроса, она работает нормально, но если я выполняю процедуру, я получаю неправильное сообщение об ошибке синтаксиса рядом с "Бристолем", но не могу понять, что мне нужно сделать, чтобы исправить, несмотря на то, что смотрю здесь и на других веб-страницах. Любая помощь будет очень признательна

Что я уже пробовал:

    ALTER PROCEDURE [TTR_HazDriver]
	@Depot nvarchar(50),
	@Class nvarchar(1)

    AS
    BEGIN
	DECLARE @Where nvarchar(1000)
	DECLARE @sSql nvarchar(MAX)
	DECLARE @Order nvarchar(1000)

    SET @sSql = '
    SELECT EM.EmployeeNumber
    , EM.EmployeeSurname
    , EM.EmployeeInitials
    , D.Depot
    , EDL.Class1
    , EDL.Class2
    , EDL.Class3
    , EDL.Class4
    , EDL.Class5
    , EDL.Class6
    , EDL.Class7
    , EDL.Class8
    , EDL.Class9
    , CONVERT(VARCHAR(10),EDL.ExpiryDate, 103) ExpiryDate
    , EDL.Tanks
    , EDL.Package
    FROM   EmployeeMaster EM 
    LEFT OUTER JOIN PayrollFrequency PF ON EM.FrequencyDesc = PF.DescCode 
    INNER JOIN EmployeeDrivingLicence EDL ON EM.EmpCode = EDL.EmpCode 
    LEFT OUTER JOIN Depot D ON EM.Depot = D.DescCode'

    SET @Where = '
    WHERE (D.Depot = ''' + @Depot + ''' OR ''' + @Depot + ''' IS NULL)
    AND EM.EmployeeLeft = ''N''
    AND PF.FrequencyDesc = ''Weekly'''
 


    SET @Order = '
		ORDER BY D.DepotDepotDescription
		, EDL.ExpiryDate'
 
    IF @Class = '1' 
	SET @Where = @Where + ' AND EDL.Class1 = ''Y'''
    IF @Class = '2' 
	SET @Where = @Where + ' AND EDL.Class2 = ''Y'''
    IF @Class = '3' 
	SET @Where = @Where + ' AND EDL.Class3 = ''Y'''
    IF @Class = '4' 
	SET @Where = @Where + ' AND EDL.Class4 = ''Y'''
    IF @Class = '5' 
	SET @Where = @Where + ' AND EDL.Class5 = ''Y'''
    IF @Class = '6' 
	SET @Where = @Where + ' AND EDL.Class6 = ''Y'''
    IF @Class = '7' 
	SET @Where = @Where + ' AND EDL.Class7 = ''Y'''
    IF @Class = '8' 
	SET @Where = @Where + ' AND EDL.Class8 = ''Y'''
    IF @Class = '9' 
	SET @Where = @Where + ' AND EDL.Class9 = ''Y'''
    IF @Class = 'T' 
	SET @Where = @Where + ' AND EDL.Tanks = ''Y'''
    IF @Class = 'P' 
	SET @Where = @Where + ' AND EDL.Package = ''Y'''


    SET @sSql = @sSql + @Where + @Order
    PRINT @sSql
 
    EXEC sp_executesql @sSQL, @Depot, @Class
    END

The print statement produces the following query:

    SELECT EM.EmployeeNumber
     , EM.EmployeeSurname
     , EM.EmployeeInitials
     , D.Depot
     , EDL.Class1
     , EDL.Class2
     , EDL.Class3
     , EDL.Class4
     , EDL.Class5
     , EDL.Class6
     , EDL.Class7
     , EDL.Class8
     , EDL.Class9
     , CONVERT(VARCHAR(10),EDL.ExpiryDate, 103) ExpiryDate
     , EDL.Tanks
     , EDL.Package
     FROM   EmployeeMaster EM 
     LEFT OUTER JOIN PayrollFrequency PF ON EM.FrequencyDesc = PF.DescCode 
     INNER JOIN EmployeeDrivingLicence EDL ON EM.EmpCode = EDL.EmpCode 
     LEFT OUTER JOIN Depot D ON EM.DepotDepotDescription = D.DescCode
     WHERE (D.DepotDepotDescription = 'Bristol' OR 'Bristol' IS NULL)
     AND PF.FrequencyDesc = 'Weekly'
     AND EDL.Class3 = 'Y'
		ORDER BY D.Depot
		, EDL.ExpiryDate

1 Ответов

Рейтинг:
2

David Cleeton

Изменил эту строку с

EXEC sp_executesql @sSQL, @Depot, @Class


К:

EXEC sp_executesql @sSQL