2016-10-10 43 views
1

我正在創建一個存儲過程,它將從窗體應用程序接收三個值。值是「biz_abbrev」,「comp_Name」和「biz_Type」。存儲過程然後會返回一個「biz_Number」。 根據「biz_abbrev」的值,存儲過程將決定在兩個表中搜索哪個表。每個表都有類似的列,包括上面的兩個「comp_Name」和「biz_Type」。 biz_abbrev由應用程序生成,並生成「abbrev1」或「abbrev2」。 數據庫中的兩個表名爲「Tbl_Avi」和「Tbl_Marine」。 下面是我的存儲過程使用EXISTS或IN作爲我的存儲過程

USE [Reports_DB] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[spGetBizNo] 
    @biz_Type nvarchar(255), 
    @comp_Name nvarchar(255), 
    @biz_abbrev nvarchar(50) 
    AS 
    DECLARE @biztemptable TABLE (
    biz_Number nvarchar(255)); 

Insert into @biztemptable 

SELECT (
     CASE @biz_abbrev 
     WHEN 'abbrev1' THEN (
     SELECT DISTINCT av.biz_Number FROM dbo.Tbl_Avi av WHERE @comp_Name =  av.Company_Name AND @biz_Type = av.Business_Type) 
     ELSE (
     SELECT DISTINCT mar.biz_Number FROM dbo.Tbl_Marine mar WHERE @comp_Name = mar.Company_Name AND @biz_Type = mar.Business_Type) 
     END) 
SELECT * FROM @biztemptable 

存儲過程運行良好,當一個表有同樣的COMPANY_NAME和biz_Type即多biz_Number直到 表一 COMPANY_NAME biz_Type biz_Number成交 器Comp1 AA 123百萬 器Comp1 AA 123 1200000 器Comp2 AB 345 1230000 器Comp2 AB 345 1450000

表b COMPANY_NAME biz_Type biz_Number週轉 器Comp1 AA 123百萬 器Comp1 AA 124 1200000 器Comp2 AB 345 1230000 器Comp2 AB 346 1450000

表B將不會運行,但將顯示錯誤

子查詢返回大於1倍的值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。 該聲明已被終止。

我如何使用上述語句中的EXISTS或IN?

+2

錯誤信息是非常明顯的,你的子查詢返回多於一行。也許你可以用頂部1來代替?這取決於你想要完成什麼以及業務規則是什麼。爲獲得最佳效果,您可以在此查看以改善您的問題。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

如果有多個獨特結果,我想獲得所有結果 –

+0

然後你需要改變你的邏輯。 –

回答

0

這是不是很清楚你在這裏試圖做什麼,但我認爲你需要一些非常接近這一點。

Insert into @biztemptable (biz_Number) 
SELECT DISTINCT av.biz_Number 
FROM dbo.Tbl_Avi av 
WHERE @comp_Name = av.Company_Name 
    AND @biz_Type = av.Business_Type 
    and @biz_abbrev = 'abbrev1' 

UNION ALL 

SELECT DISTINCT mar.biz_Number 
FROM dbo.Tbl_Marine mar 
WHERE @comp_Name = mar.Company_Name 
    AND @biz_Type = mar.Business_Type 
    and @biz_abbrev <> 'abbrev1'