假设有两个表,如:
表1:
ID ___内容
11 ___ Apple iPhone是一款出色的电子设备。
12 ___三星galaxy提供了良好的功能。
表2:
ID ___ Title
71 ___翻新诺基亚3310
72 ___全新iPhone 6
73 ___阿尔卡特T-Phone
我想创建一个从Table1
(例如11)接收ID的查询,并从Table2
返回包含来自Table1
的内容列中的字词的记录(此处为:72)。
我启用了全文,虽然找不到有效且快捷的方法来创建查询,但是甚至没有找到启动的线索。我一直在避免通过WHILE将句子解析为单词或者将它们拆分,我认为必须有正确的方法来处理它。
感谢您的帮助,如果需要进一步说明,请与我们联系。
答案 0 :(得分:1)
我找到了解决方案。它可能不是最快或最干净的,但看起来很有效。我决定使用' ' (空格)作为单词分割器。
首先,我们需要创建将文本拆分为单词的拆分函数:
CREATE FUNCTION [dbo].[f_SplitVarchar]
(
@RowData NVARCHAR(MAX) ,
@SplitOn NVARCHAR(5)
)
RETURNS @ReturnValue TABLE ( Data NVARCHAR(MAX) )
AS
BEGIN
DECLARE @Counter INT
SET @Counter = 1
WHILE ( CHARINDEX(@SplitOn, @RowData) > 0 )
BEGIN
INSERT INTO @ReturnValue
( data
)
SELECT Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1,
CHARINDEX(@SplitOn,
@RowData) - 1)))
SET @RowData = SUBSTRING(@RowData,
CHARINDEX(@SplitOn, @RowData) + 1,
LEN(@RowData))
SET @Counter = @Counter + 1
END
INSERT INTO @ReturnValue
( data )
SELECT Data = LTRIM(RTRIM(@RowData))
RETURN
END;
然后用它来获取我们的数据:
CREATE PROCEDURE prc
AS
BEGIN
SET NOCOUNT ON;
declare @TEMP table (IDTable1 int, IDTable2 int)
DECLARE @etd TABLE
(
words nvarchar(max)
)
declare @idtable1 int, @Content nvarchar(max), @word nvarchar(max)
declare k cursor local forward_only for select [ID]
,[Content] from Table1
OPEN k;
FETCH NEXT FROM k INTO @idtable1 , @Content
WHILE @@FETCH_STATUS=0
BEGIN
delete from @etd
insert into @etd (words)
select * from dbo.f_SplitVarchar(@Content,' ')
declare k1 cursor local forward_only for select words from @etd
OPEN k1;
FETCH NEXT FROM k1 INTO @word
WHILE @@FETCH_STATUS=0
BEGIN
insert into @TEMP select @idtable1, ID from Table2 where ' ' + title + ' ' like '% ' + @word + ' %'
FETCH NEXT FROM k1 INTO @word
END
close k1
deallocate k1
FETCH NEXT FROM k INTO @idtable1 , @Content
END
close k
deallocate k
select * from @TEMP
END
GO
最后,只需Exec prc
从Table1中选择ID,表2中的ID包含第一个表中的单词。如果您需要更多帮助或者您不了解任何事情,请询问=)。