2016-03-30 9 views
0

NOT LIKEの動的SQLは何らかの理由で渡されたパラメーターを受け入れません。これは、動的呼び出しにパラメータを渡さずに、単語を含む文字列を作成する場合に機能します。NOT LIKE動的SQLのSQLパラメーター

何らかの理由で、この呼び出しは、削除のNOT LIKEの@noteTextパラメータでは機能しません。 tempテーブルのすべてを削除します。 アポストロフィを持つ単語が、無効な文字列の引用に対して動的にエラーを発生させたときに渡されるときには、以下の作業が必要です。 (言葉がそれにアポストロフィを持っていない場合)、パラメータ@notetextと動的SQLは次のようになりますとき

declare @bsearchbody bit=1 
declare @bsearchtitle bit =0 
declare @notetext varchar(10)='that''s' 

create table #matched(id int,note varchar(800),title varchar(800)) 
INSERT INTO #matched 
select 1,'this is just a test. that''s fun.','test1' 
UNION ALL 
SELECT 2,' note on the ID','the is just a title' 
UNION ALL 
SELECT 3,'I watched basketball last night','basketball type' 

declare @vchsql nvarchar(1000)=N' 
DELETE from #matched 
WHERE 1=1 AND (' + CASE WHEN @bSearchBody=1 THEN 'ISNULL(note,'''') NOT LIKE ''%@noteText%''' ELSE '' END + 
        CASE WHEN @bSearchBody=1 AND @bSearchTitle=1 THEN ' AND ' ELSE '' END + 
        CASE WHEN @bSearchTitle=1 THEN 'ISNULL(title,'''') NOT LIKE 

    ''%@noteText%''' ELSE '' END + 
        ')' 

        print @vchsql 
    exec sp_executesql @vchsql,N'@notetext varchar(10)',@notetext 

スクリプトが動作します。

declare @bsearchbody bit=1 
declare @bsearchtitle bit =0 
declare @notetext varchar(10)='test' 

create table #matched(id int,note varchar(800),title varchar(800)) 
INSERT INTO #matched 
select 1,'this is just a test.','test1' 
UNION ALL 
SELECT 2,' note on the ID','the is just a title' 
UNION ALL 
SELECT 3,'I watched basketball last night','basketball type' 

declare @vchsql nvarchar(1000)=N' 
DELETE from #matched 
WHERE 1=1 AND (' + CASE WHEN @bSearchBody=1 THEN 'ISNULL(note,'''') NOT LIKE ''%'+ @noteText+ '%''' ELSE '' END + 
        CASE WHEN @bSearchBody=1 AND @bSearchTitle=1 THEN ' AND ' ELSE '' END + 
        CASE WHEN @bSearchTitle=1 THEN 'ISNULL(title,'''') NOT LIKE ''%@noteText%''' ELSE '' END + 
       ')' 

       print @vchsql 
exec sp_executesql @vchsql,N'@notetext varchar(10)',@notetext 
+0

が期待通りに@に渡されたときに( '%_ []例えば、') 'LIKE'の予約文字を含むテキストが動作しないことを忘れないでくださいnoteText。 – Lucero

答えて

1

問題は、SQLでは値がパラメータではなく文字列として解釈されることです。それで、パターンを構築してください。代わりに:

'ISNULL(title, '''') NOT LIKE ''%@noteText%''' 

使用:

'COALESCE(title, '''') NOT LIKE ''%'' + @noteText + ''%''' 
+0

あなたはそれに私を打つ - しかし、なぜISNULLをCOALESCEに置き換えるのですか?私はここに利益がないと思う。 – Lucero

+0

は完全に機能しました。ありがとう – Jt2ouan

+0

@ルセロ。 。個人の好み。私はそれらが本質的に同等であるときにANSI関数を好む。 –