2013-09-24 21 views
7

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 
+0

Tôi đã xóa Bộ tách nhận xét để làm cho mã của bạn dễ đọc hơn. – Khan

+0

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

+0

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 –

Trả lời

2

Điều này chỉ có thể thực hiện với tuyên bố đa TVF đến mức tôi có thể thấy.

Tạo hàm sau

CREATE FUNCTION [dbo].[ft_test] (@Keywords VARCHAR(50)) 
RETURNS @ReturnTable TABLE (
    PlayerID  INT, 
    PlayerName  VARCHAR(20), 
    PlayerPositions VARCHAR(60)) 
AS 
    BEGIN 
     INSERT INTO @ReturnTable 
     SELECT PlayerID, 
      PlayerName, 
      PlayerPositions 
     FROM Players 
     WHERE CONTAINS(PlayerPositions, @Keywords) 

     RETURN 
    END 

Sau đó, sau hoạt động tốt

SELECT * 
FROM TeamNeeds 
     CROSS APPLY [dbo].[ft_test] (Keywords) CA 

Mặc dù phiên bản nội tuyến không thành công với "Chức năng inline 'x' không thể lấy các thông số tương quan hoặc truy vấn con vì nó sử dụng một điều hành toàn văn. "

Các vấn đề liên quan