繁体   English   中英

如何将该表值函数编写为存储过程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM