2016-10-07 66 views
1

我正在使用動態SQL來創建將執行的'SELECT'SQL語句。在我創建的SQL語句中,我想使用'LIKE'運算符,但由於它使用反向逗號'',它與'SELECT'語句開始時使用的引號相沖突。在WHERE子句中添加LIKE運算符(動態SQL)

SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE ' + @ApplicationName + ' ;' 

假設 '@ApplicationName = TestApp',上述動態SQL '@sql' 變量會產生以下SQL語句:作爲引號不

SELECT * FROM LogTable WHERE Application LIKE TestApp ; 

這會導致錯誤存在於'TestApp'周圍。如何在動態SQL中創建引用逗號,以允許使用「LIKE」運算符?如何創建SQL語句如下:

SELECT * FROM LogTable WHERE Application LIKE 'TestApp' ; 
+2

即使你得到那個工作,小心鮑比表。如果他曾經搜索過'%TestApp%'; DROP TABLE LogTable; SELECT'你只是SQL Inject Attacked',那麼你可能會得到「意想不到的結果」!對於所有事情的熱愛,請不要使用此結構,請使用參數化查詢*(AKA Prepared Statements)*。 – MatBailie

+2

爲什麼你使用沒有通配符的搜索?如果它像這樣簡單的事情,爲什麼甚至首先使用動態SQL? –

+0

我打算實施一個MVC應用程序,其中應該有一個預定義值的下拉列表。選擇這些值應該改變@ApplicationName。我打算使用'LIKE',這樣當選擇空字段時,它會將'LIKE'運算符搜索項替換爲'%'以帶來全部。 – Dev

回答

-1

您需要將引號自行添加到SQL中。你可以讓他們兩個逃過一個單引號:

SET @sql = 
    'SELECT * FROM LogTable WHERE Application LIKE ''' + @ApplicationName + ''';' 
+2

你剛剛幫助某人打開了SQL注入攻擊的代碼。 – MatBailie

6

我會用SP_EXECUTESQL其中你不想擔心單引號

Declare @sql NVARCHAR(max) 

SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE @ApplicationName ;' 

EXEC Sp_executesql 
    @sql, 
    N'@ApplicationName varchar(100)', 
    @ApplicationName = @ApplicationName 

而且這避免SQL注入

+0

另外,您不必擔心SQL注入攻擊。總是,總是用像這樣的參數化查詢:) – MatBailie

+0

,如果有人用'''在其中搜索某個東西,你就不用擔心 –

+0

這與我所做的是一樣的。如果一個字符串文字包含一個''',那麼你準備好的語句將會很好地處理它,但是由於SQL有一些東西,比如'LIKE'Fred's App'' *,所以OP的結構將失敗(中間'''導致字符串終止並且'App'是一個語法錯誤)*。 – MatBailie