我有以下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]
当我使用这个TVF时,它不返回Fish类型的对象集合(我想要它!) - 而LINQ创建一个新的结果类型,其中包括所有“Fish”字段和字段Key和Rank
在另一个问题中,有人建议我将此TVF重写为存储过程,以便仅返回Fish对象。有人可以帮我这么做吗?此外,它需要由Rank订购。
编辑:我只需要“Fish”类型的对象,没有Key或Rank。否则,LINQ将创建一个新的返回类型,我无法轻松使用现有代码。
谢谢!
答案 0 :(得分: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]
更新 :(发表评论并更新至问题)
添加了order by子句和受限制的返回值仅来自Fishes
。假设Rank
是别名KEY_TBL
上的字段名称。
答案 1 :(得分: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]
这应该返回与存储过程的结果集相同的结果。
答案 2 :(得分:1)
此外,它需要由Rank订购。
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
编辑以评论为指导。
答案 3 :(得分:1)
第一个问题的最简单答案:改变
SELECT * FROM Fishes
到
SELECT Fishes.* FROM Fishes
答案 4 :(得分: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
表中的列。