0

これは私が取得していますエラーです:のフルテキスト検索ストアドプロシージャのエラー

Syntax error near 'online' in the full-text search condition '""online"*" and "and*" and ""text"*"'. 

これは私のストアドプロシージャ:

ALTER PROCEDURE dbo.StoredProcedure1 
(
    @text varchar(1000)=null  
) 
AS 
SET NOCOUNT ON 

declare @whereclause varchar(1000) 


SET @whereclause = @text 

SELECT articles.ArticleID AS linkid, 
     articles.abstract as descriptiontext, 
     articles.title as title, 
     'article' as source, 
     articles.releasedate as lasteditdate  
FROM articles 
     WHERE CONTAINS(title, @whereclause) 

ORDER BY lasteditdate DESC, source ASC 

この私がSPに渡す:

string content = "\"online\" and \"text\""; 

C#コードの一部:

using (SqlConnection cn = new SqlConnection(this.ConnectionString)) 
      {    
       SqlCommand cmd = new SqlCommand("StoredProcedure1", cn); 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.Add("@text", SqlDbType.VarChar).Value = searchExpression; 
       cn.Open(); 

UPDATE:
私がしようと文字列と私は取得エラー:

content = "online text"; 
Syntax error near 'text' in the full-text search condition 'online text'. 

content = "\"online\" and \"text\""; 
Syntax error near 'online' in the full-text search condition '""online"*" and "and*" and ""text"*"'. 


content = "\"online and text\""; 
Syntax error near 'online*' in the full-text search condition '""online*" and "and*" and "text"*"'. 
+0

このSPを実行するC#コードを与えてください。 –

+0

@ Sergey Olontsev、done – markiz

答えて

1

MSDNから:

は、COLUMN_NAMEと一致する条件で検索するテキストを指定します。

はnvarcharです。暗黙の変換は、別の文字データ型が入力として使用されたときに発生します。

「パラメータスニッフィング」は変換では機能しないため、パフォーマンスを向上させるためにnvarcharを使用してください。

だから私は、nvarchar型にすべて変更されました:私はスラッシュを削除し、SPに結果のchar配列を渡すために、このメソッドを使用し

cmd.Parameters.Add("@text", SqlDbType.NVarChar).Value = searchExpression; 

declare @whereclause nvarchar(1000) 
0

パラメータを追加するとき、あなたのC#コードでは、この方法を試してください。

cmd.Parameters.Add("@text", searchExpression); 
+0

エラーが発生します:\t文字リテラルの文字数が多すぎます – markiz

+0

正確な値はどのような値がsearchExpression変数にありますか?どのように初期化しますか? –

0

を私はSQLは%使用だと思います*

+1

CONTAINSのフルテキスト検索では、*を使用してください。 –

0

問題は余分な引用符が付いています。これに代えて :ユーザー入力を受け入れ、このようなクエリに直接渡す場合も

'"online*" and "and*" and "text*"' 

:それは正しい状態を生成します

string content = "online and text"; 

string content = "\"online\" and \"text\""; 

はこれを試します - あなたは本当にあなたのアプリケーションをSQLインジェクションに開いています。

+0

実際に元とは、 "オンライン"と "テキスト"を見つけることでした... しかし、私はあなたが示唆したようにそれを試しても、それは単語 "と"を検索しているので、私は文字列content = "online text"を試してみる;全文検索条件 'online text'の 'text'の近くにSyntaxエラーが出る。 – markiz

+0

"And"はFTSクエリの一部であってはなりません。ここで構文を確認してください: http://www.developer.com/db/article.php/3446891 – DmitryK

0

重要なのかどうかはわかりませんが、プロシージャがvarcharを想定していて、呼び出し元コードがパラメータがSqlDbType.Charであると言っています。 私はDeriveParametersはかなり好きだ:

SqlCommand cmd = new SqlCommand("StoredProcedure1", cn); 
cmd.CommandType = CommandType.StoredProcedure; 
cn.Open() 
SqlCommandBuilder.DeriveParameters cmd; 
cmd.Parameters("@text").Value = searchExpression; 
0

を。

public static char[] RemoveBackslash(string value) 
{ 
    char[] c = value.ToCharArray(); 
    return Array.FindAll(c, val => val != 39).ToArray(); 
} 

string content = "'\"online\" and \"text\"'"; 

Sqlparam = new SqlParameter("@search", SqlDbType.NVarChar); 
Sqlparam.Value = RemoveBackslash(content); 
Sqlcomm.Parameters.Add(Sqlparam); 
関連する問題