fehle Ich war vor einen Raum fehlt ‚wie‘
Sie haben auch die falsche Anzahl von einfachen Anführungszeichen um Ihre ‚%‘ Zeichen bekommen, die wird es verwirren.
Übrigens, Sie haben sich eine nette kleine SQL injection Sicherheitslücke dort, aus dem Inneren von SQL selbst! Wenn einer der Parameter einen Apostroph enthält, wird Ihr sqlStatement abbrechen und jedes falsche SQL im Parameternamen wird ausgeführt.
können Sie die REPLACE-Funktion verwenden einfache Anführungszeichen zu verdoppeln diesen Angriff zu verhindern:
' AND '+QUOTENAME(@SearchCat)+' LIKE ''%'+REPLACE(@Keywords, '''', '''''')+'%''...'
(Die QUOTENAME benötigt wird, wenn der Spaltenname Out-of-Band-Zeichen enthält oder ein reserviertes Wort.)
Ein sauberer (aber ziemlich verbose) Ansatz zum Generieren der SQL als mühsam jedes Zeichensatzliteral selbst ersetzen, verwenden Sie sp_executesql. Zum Beispiel:
SELECT @strStatement= N'
SELECT @Number= CaseNumber FROM app_Case
WHERE [email protected] AND [email protected]
AND '+QUOTENAME(@SearchCat)+N' LIKE ''%''[email protected]+''%''
';
SELECT @params= N'@State varchar(50), @District varchar(50), @Keywords varchar(50), @Number int OUTPUT';
EXECUTE sp_executesql @strStatement, @params, @State, @District, @Keywords, @Number OUTPUT;
Übrigens, wenn @searchCat nur eine kleine Anzahl verschiedener Werte haben kann, können Sie eine Abhilfe verwenden zu vermeiden jede dieser mühsamen dynamischen SQL Unsinn überhaupt zu tun haben:
SELECT CaseNumber FROM app_Case
WHERE [email protected] AND [email protected]
AND CASE @searchCat
WHEN 'searchableColumnA' THEN searchableColumnA
WHEN 'searchableColumnB' THEN searchableColumnB
END LIKE '%'[email protected]+'%';
Sehen Sie this eher gut Exploration von dynamisch erstellten SQL-Anweisungen in T-SQL für mehr Hintergrund und einige der Risiken, denen Sie gegenüberstehen.