Я пытался воспроизвести вашу так называемую «ошибку» на моем SQL Server 2008 (см. Код ниже). В результате он работает именно так, как вы ожидали. Я удивлен, что вы не предоставили полный код.
ОБНОВЛЕНИЕ: изменен язык полного индекса на португальский и получен тот же результат. Показывает "поведение, похожее на ошибку".
UPDATE:
Почему это происходит?
MS представила новые средства разбиения по словам в SQL Server 2008, и португальский является одним из них.
Я имею в виду, SQL должен игнорировать разрывы строк при поиске слова, и это
не. Я не верю, что это стандартное поведение полнотекстового движка. По крайней мере, это не приемлемо.
ОБНОВЛЕНИЕ: Похоже, такое поведение можно увидеть во всех новых выключателях.
-- Create auxiliary table to test languages
IF OBJECTPROPERTY(object_id('test_languages'), 'IsUserTable') IS NOT NULL
DROP TABLE test_languages;
GO
CREATE TABLE test_languages
(
componenttype varchar(30),
componentname int,
clsid uniqueidentifier,
fullpath varchar(2000),
version_no varchar(50),
manufacturer varchar(50)
);
-- Populate Auxiliary table
INSERT INTO test_languages
EXEC ('exec sp_help_fulltext_system_components ''wordbreaker''');
-- Create Cursor and check how languages work with sys.dm_fts_parser
DECLARE MY_CURSOR CURSOR FOR
select
componentname
from test_languages
INNER JOIN
sys.fulltext_languages
on sys.fulltext_languages.lcid=test_languages.componentname
ORDER BY name
DECLARE @RESULT varchar(max)
DECLARE @test_var NVARCHAR(20)
SET @test_var='"word' + CHAR(13) + 'test"'
DECLARE @componentname int
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR
INTO @componentname
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT name+ ' - '+
CASE test_languages.version_no
WHEN '6.0.6001.18000'
THEN 'Updated Language 6.0.6001.18000'
WHEN '12.0.9735.0'
THEN 'Old Language 12.0.9735.0'
WHEN '12.0.6828.0'
THEN 'Old Language 12.0.6828.0'
END
AS [Language_Type]
FROM test_languages
INNER JOIN
sys.fulltext_languages
ON sys.fulltext_languages.lcid=test_languages.componentname
WHERE lcid=@componentname
SELECT display_term
FROM sys.dm_fts_parser (@test_var, @componentname, 0, 0)
FETCH NEXT FROM MY_CURSOR
INTO @componentname
END;
-- clean up the mess
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR;
DROP TABLE test_languages;
Решение о том, является ли это приемлемым, зависит от MS. Вы можете отправить заявку в службу поддержки.
Что произойдет, если мои пользователи вставят строки с разрывами строк в мою таблицу
(и это обычно, так как они могут написать все, что хотят, потому что
поле является памятным полем)?
WYSIWYG
Есть ли способ исправить это?
Может быть, вам потребуется загрузить собственный инструмент разбиения по словам или перейти на SQL Server 2005.
Goodluck в любом случае!
USE
master
GO
CREATE
DATABASE Test_Brazil -- Portuguese (Brazil)
COLLATE
Latin1_General_100_CI_AI
USE
Test_Brazil
GO
CREATE
TABLE [dbo].[test](
[test] [varchar] (100) NOT NULL
)
ON [PRIMARY]
CREATE UNIQUE NONCLUSTERED INDEX [test] ON [dbo].[test]
(
[test]
ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
GO
CREATE
FULLTEXT CATALOG ft AS DEFAULT;
CREATE
FULLTEXT INDEX ON test(test)
KEY INDEX test
WITH STOPLIST = SYSTEM;
sp_fulltext_database 'enable'
insert into test values ('word' + Char(9) + 'test') --Tab
insert into test values ('word' + Char(10) + 'test') -- Line feed
insert into test values ('word' + Char(13) + 'test') -- Carriage return
insert into test values ('word test')
-- wait 3 sec
select test from test where contains(test, '"word test"')
-- 4 rows returned
DROP FULLTEXT INDEX ON dbo.test
CREATE
FULLTEXT INDEX ON dbo.test
(
test Language 2070 -- Portuguese
)
KEY INDEX test;
-- 2 rows returned
select * from test where contains(test, '"word test"')