2011-01-10 67 views
0
ALTER PROCEDURE [dbo].[test] 
@tour int, 
@tourname varchar(50) OUTPUT, 
@tourdepartures varchar(50) OUTPUT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for procedure here 
SET @tourname = (select [tour name] from dbo.products1 where tour = @tour) 

SET @tourdepartures = (select ddate7 from dbo.TDEPART1 where tour = @tour and depart > convert(int,getdate())) 

END 

我想用一個存儲過程來填充我的asp.net 頁面上的標籤和一個下拉列表消息512,級別16,狀態1,過程測試,行21子查詢返回多個值

@tourname將填充到一個單一的標籤

而@tourdepartures將多個日期,我想在一個下拉列表

然而,當我跑我的SP我得到這個錯誤

Msg 512, Level 16, State 1, Procedure test, Line 21 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

(1 row(s) affected) 

(1 row(s) affected) 

,它工作時我做

ALTER PROCEDURE [dbo].[test] 
@tour int, 
@tourname varchar(50) OUTPUT, 
@tourdepartures varchar(50) OUTPUT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for procedure here 
SET @tourname = (select [tour name] from dbo.product where tour = @tour) 

SET @tourdepartures = (select top 1 ddate7 from abcfilestest.dbo.TDEPART where tour = @tour and depart > convert(int,getdate())) 

END 

,但它只是給我的第一個日期,

+0

列名是否正確? 「旅遊名稱」或「旅遊名稱」? – 2011-01-10 17:53:17

+0

是的,我認爲這與我回來的旅行日期相比更多的出發日期的事實,但爲什麼不能將我的@tourdepartures設置爲多於一個日期 – MyHeadHurts 2011-01-10 17:57:58

回答

1

擺脫第二SET的,只是返回一個結果,你可以使用一個讀者:

ALTER PROCEDURE [dbo].[test] 
@tour int, 
@tourname varchar(50) OUTPUT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

    -- Insert statements for procedure here 
SET @tourname = (select [tour name] from dbo.products where tour = @tour) 

select ddate7 from abcfilestest.dbo.TDEPART where tour = @tour and depart > convert(int,getdate()) 

END 
0

你可以試試這個刪除的錯誤,但我不認爲這是你真正想要什麼:

-- Insert statements for procedure here 
SET @tourname = (select TOP 1 [tour name] from dbo.products where tour = @tour) 

SET @tourdepartures = (select TOP 1 ddate7 from abcfilestest.dbo.TDEPART where tour = @tour and depart > convert(int,getdate())) 

如果你真的希望所有的巡迴演出的日期列表,最後一條語句改爲

select ddate7 from abcfilestest.dbo.TDEPART where tour = @tour and depart > convert(int,getdate()) 

並解析結果,在客戶端上設置你通常會。

另外,對於所有神聖的愛,請將ddate7列重命名爲有意義的東西。

0

標量變量只能保存一個值。您正在使用的查詢返回多個值。你有幾個選擇,正確的取決於你的情況。

如果您只想要最新日期,請在您的選擇中使用top 1和order by date desc。

如果你想要所有的日期,那麼使用一個表變量而不是標量變量。我知道我可以在SQL Server 2008中使用表變量作爲存儲過程參數,不確定2005年左右。您可以返回2個記錄集(以便在返回的內容中保持一致)或者一個輸出變量和一個選擇而不是使用輸出變量。

相關問題