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

时间:2010-05-24 17:02:21

标签: sql user-defined-functions

我有以下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将创建一个新的返回类型,我无法轻松使用现有代码。

谢谢!

5 个答案:

答案 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表中的列。