Tôi gặp sự cố khi viết lại quy trình hiện có sử dụng biến vị ngữ CONTAINS
. Quy trình hiện tại đang hoạt động bằng cách sử dụng một số CURSOR
, nhưng nó thực sự chậm và chậm hơn khi được chèn thêm dữ liệu.SQL Server CONTAINS Predicate - sử dụng giá trị cột như <contains_condition>
Tôi đã tạo một ví dụ đơn giản (mã bên dưới) chứa hai bảng - một là Toàn văn được lập chỉ mục và cột còn lại xác định điều kiện CONTAINS
để chọn hàng từ đầu tiên.
Quy trình được lưu trữ hiện tại sử dụng CURSOR
để lặp qua bảng thứ hai, đặt biến số @filter
, sau đó sử dụng CONTAINS
để xác định các hàng từ bảng đầu tiên khớp. Vấn đề là nó chạy hàng giờ và nó trở nên tồi tệ hơn.
Để tăng tốc quá trình, tôi đã cố gắng sử dụng thuộc tính CONTAINS
trực tiếp trên giá trị cột thay vì trải qua sự đau đớn của con trỏ ... nhưng tôi nhận được lỗi cú pháp. Ví dụ của tôi là dưới đây.
Tôi đã cố gắng triển khai CROSS APPLY
và tôi cũng đã cố gắng viết Chức năng do người dùng xác định (fnCONTAINS
) mà không có may mắn.
IF (object_id('Players') IS NOT NULL)
DROP TABLE Players
go
IF (object_id('TeamNeeds') IS NOT NULL)
DROP TABLE TeamNeeds
go
-- create fulltext catalog ft as default
go
CREATE TABLE Players
(
PlayerID INT IDENTITY(1, 1),
PlayerName VARCHAR(20),
PlayerPositions VARCHAR(60)
)
go
CREATE UNIQUE INDEX IXPlayerID
ON Players(PlayerID)
go
CREATE fulltext INDEX ON Players(PlayerPositions) KEY INDEX IXPlayerID
go
INSERT Players
(PlayerName,
PlayerPositions)
VALUES('Patrick Travers',
'Pitcher,Left Field,Center Field,Right Field,Shortstop')
go
CREATE TABLE TeamNeeds
(
TeamID INT,
Keywords VARCHAR(50)
)
go
INSERT TeamNeeds
(TeamID,
Keywords)
VALUES(1,
'"Center Field" and "Shortstop" and "Pitcher"')
go
WAITFOR delay '00:00:05'
go -- Give the Full Text Index process time to populate the catalog
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Player,
TeamNeeds
WHERE CONTAINS(PlayerPositions, Keywords)
go -- Syntax error on Keywords...
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Players,
TeamNeeds
WHERE CONTAINS(PlayerPositions, '"Center Field" and "Shortstop" and "Pitcher"')
go -- Works just fine, but requires setting an explicit search expression for every search, which is terribly slow
Tôi đã xóa Bộ tách nhận xét để làm cho mã của bạn dễ đọc hơn. – Khan
Tôi cũng đang tìm cách trả lời câu hỏi này. Tôi nhìn mặc dù stackoverflow và tài liệu của ms, nhưng có vẻ như bạn không thể làm CONTAINS (table1.col, table2.col). Bạn chỉ có thể thực hiện CONTAINS (table1.col, 'text') hoặc CONTAINS (table1.col, @some_text). Tôi hy vọng ai đó đến và chứng minh tôi sai. – Nico
Bạn đã tìm ra cách giải quyết vấn đề này chưa? Tôi có cùng một vấn đề. Đã trả lời –