我试图在存储过程中封装全文搜索查询。这是程序创建代码本身:
CREATE PROCEDURE [dbo].[fts]
@query varchar,
@salesbase int
AS
SELECT c1.* FROM CONTACT1 c1
JOIN CONTACT2 c2 ON c1.ACCOUNTNO = c2.ACCOUNTNO
WHERE c2.USLEBASE = @salesbase
AND (
CONTAINS(c1.COMPANY, @query) OR
CONTAINS(c1.ADDRESS1, @query) OR
CONTAINS(c1.CONTACT, @query)
)
调用@query
设置为'"*Donalds*"'
的存储过程将返回以下错误:
EXECUTE [fts] @query = '"*Donalds*"', @salesbase = 410
> Syntax error near '"' in the full-text search condition '"'.
这让我感到困惑,因为如果我引用了肉类的话。它上面的存储过程 - 使用完全相同的值 - 没有语法错误。
SELECT c1.* FROM CONTACT1 c1
JOIN CONTACT2 c2 ON c1.ACCOUNTNO = c2.ACCOUNTNO
WHERE c2.USLEBASE = 410
AND (
CONTAINS(c1.COMPANY, '"*Donalds*"') OR
CONTAINS(c1.ADDRESS1, '"*Donalds*"') OR
CONTAINS(c1.CONTACT, '"*Donalds*"')
)
> (291 row(s) affected)
我必须遗漏一些基本的东西。有什么想法吗?
答案 0 :(得分:0)
您应该声明具有指定长度的varchar
变量。
根据{{3}}并且据我所知,如果您宣布varchar
没有特定长度,则实际上是宣布varchar(1)
。
this article中也说明了这一点:
如果在数据定义或变量声明语句中未指定n,则默认长度为1.使用CAST和CONVERT函数时未指定n时,默认长度为30.