2016-10-10 20 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'