2016-11-15 61 views
2

此查询为我提供错误:“建议”附近的语法错误。子查询中含有来自查询表的条件的containstable

SELECT(SELECT COUNT(*) FROM CONTAINSTABLE(Products,keywords,Suggestion)) InventoryRank 
FROM (
    SELECT Suggestion FROM aTable 
) 

我该如何给出相同的结果?

+0

'SELECT建议从一张表返回一个或多个行吗? – wdosanjos

+0

@wdosanjos:它返回多行 – Mohsen

回答

0

CONTAINSTABLE在搜索条件下无法使用表列。你可以把它想:

DECLARE @search nvarchar(4000) 

SELECT @search = STUFF(( 
    SELECT '*" or "' + Suggestion 
    FROM aTable 
    FOR XML PATH('') 
),1,6,'') +'*"' 

--That will give you string like "sug1*" or "sug2*" or "sug3*" to search 
--You can make whatever you need string. F.e. "sug1" or "sug2" or "sug3" 

SELECT COUNT (*) 
FROM CONTAINSTABLE(searched_table,searched_column,@search) 

编辑

如果你需要每Suggestion不同InventoryRank,您可以使用动态SQL和临时表:

IF OBJECT_ID(N'##temp') IS NOT NULL DROP TABLE ##temp 

CREATE TABLE ##temp (
    Suggestion nvarchar(max), 
    InventoryRank int 
) 

DECLARE @sql nvarchar(max) 


SELECT @sql = (
    SELECT N'INSERT INTO ##temp SELECT '''+Suggestion+''' as Suggestion, COUNT (*) as InventoryRank FROM CONTAINSTABLE(searched_table,searched_column,'''+Suggestion+''');' 
    FROM aTable 
    FOR XML PATH('') 
) 
--PRINT(@sql) 

EXEC sp_executesql @sql 

SELECT * 
FROM ##temp 

PRINT会给您查询:

INSERT INTO ##temp SELECT 'sug1' as Suggestion, COUNT (*) as InventoryRank FROM CONTAINSTABLE(searched_table,searched_column,'sug1'); 
INSERT INTO ##temp SELECT 'sug2' as Suggestion, COUNT (*) as InventoryRank FROM CONTAINSTABLE(searched_table,searched_column,'sug2'); 

所以你do'nt需要一个WHILE循环或光标通过的所有行aTable

+0

谢谢,但我需要一个不同的'InventoryRank'每个建议。 – Mohsen

+0

我添加了一些信息,请看看:) – gofr1

+0

:这样的作品,但有点慢,我不确定它是否可以处理数百万条记录或不是。任何建议? ;) – Mohsen

1

运行的CONTAINSTABLE第三个参数必须是文字或变量,它不能是列名。如果你需要每个建议的数量,你可以尝试以下方法:

DECLARE @suggestion varchar(100); 
DECLARE @result table (Suggestion varchar(100), Result int); 
DECLARE csr CURSOR FOR SELECT Suggestion FROM aTable; 

FETCH NEXT FROM csr INTO @suggestion; 

WHILE @@FETCH_STATUS = 0 BEGIN 
    INSERT INTO @result (Suggestion, Result) 
     SELECT @suggestion, (SELECT COUNT(*) FROM CONTAINSTABLE(Products,keywords,@suggestion)); 
    FETCH NEXT FROM csr INTO @suggestion; 
END 

CLOSE csr; 
DEALLOCATE csr; 

SELECT * FROM @result; 

MSDN CONTAINSTABLE (Transact-SQL)文档。