2016-11-15 5 views
2

이 쿼리는 " 'Suggestion'근처의 구문이 잘못되었습니다."라는 오류 메시지를 표시합니다.쿼리 테이블의 조건이 포함 된 containstable을 포함하는 하위 쿼리

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

어떻게 동일한 결과를 얻을 수 있습니까?

+0

'제안 제안 선택'은 하나 또는 여러 행을 반환합니까? – wdosanjos

+0

@wdosanjos : 복수 행을 반환합니다. – Mohsen

답변

0

CONTAINSTABLE은 검색 조건에서 테이블 열과 함께 작업 할 수 없습니다. 당신은 그것을 좋아 할 수 있습니다 :

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 

인쇄하면 쿼리 줄 것이다 :

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 및 임시 테이블을 사용할 수 있습니다 필요한 경우

:

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'); 

그래서 모든 루프를 돌릴 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) 문서를.