2012-11-08 228 views
1

我有一個存在於鏈接服務器上的表,它有一個名爲name的字段,我想在該字段上搜索名爲Macy's的字符串。我正在執行這個動態SQL: -SQL SERVER如何轉義特殊字符

declare @Sql nvarchar(2000) 
declare @searchName nvarchar(255) 

SET @searchName = N'macy''s' 
SET @sql = 'SELECT * from crm_opportunity o where o.NAME LIKE ''% ' + @searchName + '%'' ESCAPE '''''' ' 
exec (@sql). 

換句話說,我試圖逃避單引號。 's'附近出現錯誤消息102,級別15,狀態1,行1語法錯誤。

任何想法和建議!

回答

5

而不是使用EXEC的,使用sp_executesql和參數化查詢:

execute sp_executesql 
    N'SELECT * from crm_opportunity o where o.NAME LIKE ''%'' + @searchName + ''%''', 
    N'@searchName nvarchar(255)', 
    @searchName = N'macy''s' 

這不僅有助於避免混淆報價逃跑,但它也保護您免受SQL注入攻擊。

+0

非常感謝您的答覆,它的工作原理。但是,您是否也可以告訴我如何使用EXEC執行此操作。 – SaiBand

+0

@SaiBand您需要在您的「@ searchName」變量中加倍引用您的引號...... SET @searchName = N'macy'''s'' –

+0

@SaiBand爲了澄清,您必須將引號,因爲它們需要被轉義兩次......在第一次賦值之後,你的變量將包含'macys's''。你需要這個變量有兩個引號,以便在被'EXEC'評估時它會被再次轉義。 –

0

雙引號會將字符轉義,因此您在字符串值中使用它。

exec('select * from [dbo].[UsersTbl] where and UserType = ''CLT'' ') 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/11588829) –

+0

''CLT'',這裏的特殊字符是'' –