2009-03-24 5 views
1

誰かが、SQL文が '%' + @ Keywords + '%' 'のように' + @SearchCat + 'と' + @SearchCat + 'という次の行が好きでない理由を理解できますか?一重引用符の数と関係がありますが、わかりません。引用符はどのように機能するのですか?論理は何ですか?SQL変数

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) 

答えて

0

私はそれを理解します。私はあなたにも、あなたの「%」文字、周りの単一引用符の間違った番号を持っている

2

私は

「のような」の前にスペースがありませんでした「のような」の前にスペースが不足してましたそれを混乱させます。

ちなみに、SQL自体の中から、SQL injectionのセキュリティホールがありました。いずれかのパラメータにアポストロフィが含まれていると、sqlStatementが破損し、パラメータ名の不正なSQLが実行されます。

あなたはこの攻撃を防ぐために、単一引用符を二重にするREPLACE関数を使用することができます。

' AND '+QUOTENAME(@SearchCat)+' LIKE ''%'+REPLACE(@Keywords, '''', '''''')+'%''...' 

(列名は、アウトオブバンドの文字が含まれているか、予約語である場合QUOTENAMEが必要です。)

すべての文字列リテラルを自分で置き換えるのではなく、きれいな方法でSQLを生成する方法は、sp_executesqlです。例:ところで

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; 

@searchCatだけ異なる値の数が少ないことができれば、あなたがすべてで、この面倒な動的SQLのナンセンスのいずれかを実行することを避けるために回避策を使用することができます。

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]+'%'; 

thisを参照してください。T-SQLで動的に作成されたSQL文をより詳細に調査して、より多くの背景と直面するリスクを軽減します。