2009-03-24 7 views
1

Kann mir jemand helfen, herauszufinden, warum die SQL-Anweisung die folgende Zeile 'und' + @SearchCat + 'nicht gefällt wie'% '+ @ Keywords +'% '. Es hat mit der Anzahl der einfachen Anführungszeichen zu tun, aber ich kann es nicht herausfinden. Wie funktionieren die Zitate? Was ist die Logik?sql Variablen

DECLARE @strStatement varchar(550) 
declare @state as varchar(50) 
declare @district as varchar(50) 
declare @courttype as varchar(50) 
declare @SearchCat as varchar(50) 
declare @KeyWords as varchar (50) 

select @State ='FL' 
select @district = '11' 
select @courtType = '1' 
select @SearchCat='CaseNumber' 
select @KeyWords='File' 


select @strStatement= 'SELECT CaseNumber FROM app_Case 
      where State ='''+ @State+ 
      ''' and District='''+ @District+ 
      ' and ' + @SearchCat + 'like '%'[email protected]+'%'' 


exec (@strStatement) 

Antwort

0

Ich finde es heraus. Ich war ein Leerzeichen vor ‚wie‘

2

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.

Verwandte Themen