2010-05-24 72 views
0

我有全文檢索以下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,它沒有返回類型的魚對象的集合 - 而不是LINQ創建一個新的(我想!)結果類型,其中包括所有「魚」字段和字段鍵和秩。

在另一個問題中,有人建議我將此TVF重寫爲一個存儲過程,以便它僅返回Fish對象。有人可以幫我做這個嗎?此外,它需要由Rank排序。

編輯:我只需要「魚」類型的對象,沒有鍵或等級。否則,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] 

更新:(以下意見和更新問題)

添加ORDER BY子句和限制的返回值是隻從Fishes。假設Rank是別名KEY_TBL上的字段名稱。

+0

我不認爲這是完整的...... 1)我不希望Rank和Key被返回,2)我需要它按Rank排序,以及3)我需要LINQ來考慮類型Fish的結果類型(而不是一些任意的新的SP結果返回類型)。 – Alex 2010-05-24 17:09:16

+0

@Alex - 更新了答案。當你第一次提出問題時,你應該確定你的要求,否則你會得到許多不相關的答案。 – Oded 2010-05-24 17:27:05

+0

我在原始問題中有這樣的要求:「(...)它僅返回Fish對象。 (...)它需要按Rank排序「我在我的編輯中再次指出它,因爲它似乎沒有人閱讀整個問題......感謝您的幫助! – Alex 2010-05-24 17:30:47

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

所以現在只返回類型的魚的對象? (沒有更多的關鍵和排名) – Alex 2010-05-24 17:06:48

+0

@Alex:如果你只需要來自「魚」表的列,你將不得不使用「SELECT Fishes。* ....'語句(相應地調整我的帖子)。 – 2010-05-24 18:08:25

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 

編輯的評論引導。

+0

與其他結果相同的問題 - 我需要返回類型爲LINQ中的「Fish」,「Fish」域對象沒有從Containstable返回的屬性Rank和Key,所以我需要返回沒有這些屬性的對象,因此LINQ可以將返回類型標識爲「Fish」 – Alex 2010-05-24 17:14:27

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 *'通常是不可取的,「魚對象」與表定義緊密結合;所以當表定義發生變化時,這種鬆散的耦合會給他帶來問題。 – egrunin 2010-05-24 17:35:46

+0

@egru nin - 不!如果表定義發生更改,則存儲過程不一定會重新編譯,Select *將不會返回正確的結果。如果模式更改,則應更新存儲的proc以說明新更改。 – Thomas 2010-05-24 17:49:00

+0

@egrunin - 在更新版本的SQL Server中,編譯問題已得到解決可能是這種情況。在舊版本中,一旦編譯了視圖或sp,它就會將*轉換爲表中的列。如果列更改,視圖或sp將不會反映更改。儘管如此,程序和udfs應該像模式一樣對待,並且應該與表模式一起更新。 – Thomas 2010-05-24 18:09:46

1

最簡單的回答你的第一個問題:改變

SELECT * FROM Fishes 

SELECT Fishes.* FROM Fishes