Хранимая процедура 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