2015-11-16 57 views
-1

我試圖編寫一個給定遊戲名稱的SQL函數,它將允許我搜索特定遊戲的遊戲表並返回關於該遊戲的所有信息遊戲。使用用戶定義函數搜索表格

這是爲奧運會表的代碼:

CREATE TABLE Games(

game_id INT IDENTITY PRIMARY KEY, 
name VARCHAR(50), 
release_date VARCHAR(50), 
rating VARCHAR(5), 
min_age INT, 
development_team_email VARCHAR(50) FOREIGN KEY REFERENCES Development_Teams, 
release_conference INT FOREIGN KEY REFERENCES Conferences 
) 

這裏是我能想出當我試圖寫的函數:

create function SearchGames(@game_name varchar(50)) 

returns table 
begin 
declare @game 

Select (*) 
From Games 
where Games.name = @game_name 

return @game 
end 

我越來越很多語法錯誤,我不知道我做錯了什麼。任何幫助讚賞。

+0

我認爲你的決定使用development_team_email作爲主鍵不是一個好主意。我有點懷疑你的一些數據類型。 release_date作爲varchar?評分爲varchar? –

+0

糟糕。 release_date不應該是一個varchar。然而,評級應該,因爲它可以是PG,M,T等 – ninesalt

+0

啊那麼這是一個很好的例子,這個名稱的名稱可以比評級更具描述性。 :)我認爲這是評級,如評論評級。也許像ContentRating可能?這當然是主題。 –

回答

0

我不推薦使用這個function,而是stored procedure

Create Proc spSearchGames (@game_name Varchar (50)) 
As Begin 
    Select * 
    From Games 
    Where name = @game_name 
End 
Go 

並執行它:

Exec spSearchGames 'YourGameName' 
+0

我希望有人會提到存儲過程。請問,在上帝的份上,你是決定使用功能還是傳統程序?這讓我瘋狂 – ninesalt

+0

對我來說'函數'將用於你想要轉換數據或者迭代每行的東西。而「存儲過程」更適合於容納特定查詢或簡單執行一組查詢(例如搜索查詢)。你可以使用/或在這種情況下,但在我看來,使用proc更有意義。 – Siyual

+0

好吧。到底什麼是「go」關鍵字? – ninesalt

2

使用inline table valued function語法和添加模式:

create function dbo.SearchGames(@game_name varchar(50)) 
returns table 
AS 
RETURN (Select * 
     From Games 
     where Games.name = @game_name); 

SqlFiddleDemo

如果你使用存儲過程,你需要使用:

CREATE TABLE ...; 
INSERT INTO ... EXEC stored_procedure @args; 
-- another operation on stored procedure resultset 

而內聯表函數你只是:

SELECT * FROM dbo.SearchGames('aaa') GROUP BY ... HAVING ... ORDER BY; 
+0

你爲什麼加上「dbo」。函數名稱之前? – ninesalt

+0

因爲函數應該提供架構 – lad2025

+0

我會更進一步,並建議您在創建或引用對象時應始終使用架構。它確實不限於功能。 :) –