[英]How can I write this Table Valued Function as a Stored Procedure?
我具有以下用于全文搜索的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对象。 有人可以帮我吗? 另外,还需要按等级排序。
编辑: 我只需要类型“鱼”的对象,没有关键或等级。 否则LINQ将创建一个新的返回类型,这对于我现有的代码不容易使用。
谢谢!
你的意思是这样吗?
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
上的字段名称。
好没问题:
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]
那应该返回相同的结果,作为存储过程的结果集。
另外,还需要按等级排序。
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
编辑以评论为指导。
第一个问题的最简单答案:变更
SELECT * FROM Fishes
至
SELECT Fishes.* FROM Fishes
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
表,只能从指定的列Fishes
在SELECT子句中的表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.