2017-11-17 1 views
0

Ich habe die folgende gespeicherte Prozedur, die 2 Parameter benötigt. Der @ Class-Parameter kann einen beliebigen von 11 Werten haben. Abhängig vom Wert betrachtet die WHERE-Klausel eine andere Spalte.sql gespeicherte Prozedur bedingte where-Klausel, die Syntaxfehler zurückgibt

Die Prozedur kompiliert ok und wenn ich den Druck kopieren und in ein neues Abfragefenster einfügen, läuft es gut, aber wenn ich die Prozedur ausführen bekomme ich eine falsche Syntax Fehlermeldung in der Nähe von 'Bristol' aber kann nicht herausfinden, was ich Es muss getan werden, um zu reparieren, obwohl Sie hier und auf anderen Webseiten suchen. Jede mögliche Hilfe würde viel

geschätzt werden
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 

Die print-Anweisung erzeugt die folgende Abfrage:

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 
+2

Die Abfrage erzeugt eine schlechte Übereinstimmung mit dem Code in der gespeicherten Prozedur. Woher kommt 'EM.EmployeeMasterLeft'?' FrequencyDesc' ?, 'EDL.ExpiryDate> = {ts '2007-01-01 00:00:00'}'? –

+0

Es ist hilfreich, Datenbankfragen sowohl mit der entsprechenden Software (MySQL, Oracle, DB2, ...) als auch mit der Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. Beachten Sie, dass 'tsql' die Auswahl einschränkt, aber die Datenbank nicht angibt. – HABO

+0

Habe meinen ursprünglichen Code bearbeitet –

Antwort

1

Da Sie die Parameterwerte in die Abfragevariable sind Einbetten Sie brauchen nicht die params hinzufügen zum sp_executesql Anruf, sollte dies so funktionieren:

EXEC sp_executesql @sSQL 

Statt:

EXEC sp_executesql @sSQL, @Depot, @Class 

Hier ist ein voll funktionsfähiges Beispiel mit DDL-Anweisungen - tauschen Sie die letzte Zeile mit der ursprünglichen Version aus, und Sie erhalten den Syntaxfehler.

CREATE TABLE EmployeeMaster (EmployeeNumber INT, EmployeeSurname VARCHAR(25), EmployeeInitials VARCHAR(10), FrequencyDesc VARCHAR(25), EmpCode VARCHAR(25), Depot VARCHAR(25), EmployeeLeft VARCHAR(1)) 
CREATE TABLE PayrollFrequency (DescCode VARCHAR(25), FrequencyDesc VARCHAR(25)) 
CREATE TABLE EmployeeDrivingLicence (EmpCode VARCHAR(25), Class1 VARCHAR(1), Package VARCHAR(1), Tanks VARCHAR(1)) 
ALTER TABLE EmployeeDrivingLicence ADD ExpiryDate DATETIME 
CREATE TABLE Depot (Depot VARCHAR(25), DescCode VARCHAR(25), DepotDepotDescription VARCHAR(25)) 

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

AS 
BEGIN 

... 

EXEC sp_executesql @sSQL 
END 
GO 

EXEC [TTR_HazDriver] 'test', 'P' 
+0

Funktioniert nicht, um Auswirkungen zu erzielen. –

+0

@Max Szczurek danke, dass es ein Leckerbissen war –

Verwandte Themen