2010-05-24 2 views
0

나는 전체 텍스트 검색을위한 다음 TVF이 :이 TVF를 사용하고 때이 테이블 반환 함수를 저장 프로 시저로 어떻게 작성할 수 있습니까?

FUNCTION [dbo].[Fishes_FullTextSearch] 
(@searchtext nvarchar(4000), @limitcount int) 
RETURNS TABLE 
AS 
RETURN 
SELECT * FROM Fishes 
INNER JOIN CONTAINSTABLE(Fishes, *, @searchtext, @limitcount) 
AS KEY_TBL ON Fishes.Id = KEY_TBL.[KEY] 

,이 유형의 물고기 개체의 컬렉션 반환하지 않습니다 - 대신 LINQ는 새로운를 생성한다 (내가 원하는!) 모든 "Fish"필드와 Key와 Rank 필드를 포함하는 결과 유형.

다른 질문으로,이 TVF를 Fish 객체 만 반환하는 저장 프로 시저로 다시 작성하는 것이 좋습니다. 누군가 나를 도와 줄 수 있습니까? 또한 순위에 따라 정렬해야합니다.

편집 : 키 또는 순위없이 "물고기"유형의 개체 만 필요합니다. 그렇지 않으면 LINQ는 기존 코드에서 쉽게 사용할 수없는 새로운 반환 형식을 만듭니다.

고맙습니다!

답변

2

이렇게 하시겠습니까?

CREATE PROCEDURE [dbo].[Fishes_FullTextSearch] 
    @searchtext nvarchar(4000), 
    @limitcount int 
AS 
SELECT Fishes.* FROM Fishes 
    INNER JOIN CONTAINSTABLE(Fishes, *, @searchtext, @limitcount) 
    AS KEY_TBL ON Fishes.Id = KEY_TBL.[KEY] 
    ORDER BY KEY_TBL.[Rank] 

업데이트 : 절 ​​및 제한 반환 값에 의해 (질문하는 의견 및 업데이트 다음)

추가 된 순서는 Fishes에서 할 수 있습니다. Rank이 별칭이 지정된 KEY_TBL의 필드 이름이라고 가정합니다.

+0

이것이 아직 완료되지 않았다고 생각합니다 ... 1) 순위와 키가 반환되는 것을 원하지 않습니다. 2) 순위에 따라 정렬해야합니다. 3) LINQ를 사용하여 Fish 유형의 결과 유형을 고려해야합니다. (임의의 새로운 SP 결과 리턴 유형이 아님). – Alex

+0

@Alex - 업데이트 된 답변. 당신이 처음 질문을 할 때 당신은 정말로 당신의 요구 사항을 모두 나타내야 만합니다. 그렇지 않으면 당신은 많은 무관 한 대답을 얻을 것입니다. – Oded

+0

나는 원래의 질문에 그 요구 사항을 가지고 있었다 : "(...) 물고기 개체 만 반환합니다. (...) 순위에 따라 정렬해야합니다. "아무도 전체 질문을 읽지 못했기 때문에 방금 편집 한 내용을 지적했습니다. 도움을 제공해 주셔서 감사합니다! – Alex

1

물론 - 아무 문제 : 저장 프로 시저에서 결과 집합으로, 같은 결과를 반환해야합니다

CREATE PROCEDURE [dbo].[Fishes_FullTextSearch] 
     @searchtext nvarchar(4000), 
     @limitcount int 
AS 
    SELECT Fishes.* 
    FROM dbo.Fishes 
    INNER JOIN CONTAINSTABLE(Fishes, *, @searchtext, @limitcount) AS KEY_TBL 
     ON Fishes.Id = KEY_TBL.[KEY] 

.

+0

SELECT * FROM Fishes 

을 변경? (더 이상 키와 랭크) – Alex

+0

@Alex : "Fishes"테이블의 컬럼 만 필요하면'SELECT Fishes. * ....'문을 사용해야한다. –

1

또한 순위에 따라 정렬해야합니다.

CREATE PROCEDURE [dbo].[Fishes_FullTextSearch] 
@searchtext nvarchar(4000), 
@limitcount int 
AS 

SELECT Fishes.* 
FROM Fishes 
INNER JOIN CONTAINSTABLE(Fishes, *, @searchtext, @limitcount) AS KEY_TBL ON Fishes.Id = KEY_TBL.[KEY] 
ORDER BY Fishes.Rank 

편집 코멘트에 의해 유도.

+0

다른 결과와 같은 문제 - 필요합니다. 반환 유형을 LINQ에서 "Fish"로 지정합니다 .Fish 도메인 객체에는 Containstable에서 반환 된 Rank 및 Key 속성이 없으므로 LINQ가 반환 유형을 "Fish"로 식별 할 수 있도록 해당 속성없이 객체를 반환해야합니다. – Alex

0
Create Procedure dbo.Fishes_FullTextSearch 
     @searchtext nvarchar(4000) 
     , @limitcount int 
AS 
    Select Fishes.Col1, Fishes.Col2, ... 
    From dbo.Fishes 
    Join ContainsTable(Fishes, *, @searchtext, @limitcount) AS FreeTextTable 
     On Fishes.Id = FreeTextTable.Key 
    Order By FreeTextTable.Rank 

Select *을 사용하지 말고 원하는 열을 나열해야합니다. 따라서 Fishes 테이블의 열만 원하면 Select 절의 Fishes 테이블의 열만 지정하십시오.

+0

'SELECT *'는 일반적으로 추천 할 수 없지만 "Fish 객체"는 테이블 정의와 밀접하게 결합되어 있으므로 테이블 정의가 변경 될 때이 느슨한 결합으로 인해 문제가 발생할 수 있습니다. – egrunin

+0

@egru 아니 - 아니! 테이블 정의가 변경되면 저장된 proc이 다시 컴파일되지 않고 Select *가 올바른 결과를 반환하지 않습니다. 스키마가 변경되면 저장된 변경 사항은 새로운 변경 사항을 고려하여 업데이트되어야합니다. – Thomas

+0

@egrunin - 최신 SQL Server 버전의 경우 컴파일 문제가 해결되었을 수도 있습니다. 이전 버전에서는 뷰 또는 sp가 컴파일되면 테이블의 열로 변환됩니다. 열이 변경되면보기 또는 sp에 변경 내용이 반영되지 않습니다. 여전히 프로 시저와 udfs는 스키마와 같이 처리되어야하며 테이블 스키마와 함께 업데이트되어야합니다. – Thomas

1

첫 번째 질문에 대한 간단한 대답은 : 그래서 지금은 형의 생선 만의 객체를 반환합니다

SELECT Fishes.* FROM Fishes 
관련 문제