使用EXISTS或IN作为我的存储过程

时间:2016-10-10 16:47:44

标签: sql-server

我正在创建一个存储过程,它将从表单应用程序中接收三个值。值为" biz_abbrev"," comp_Name"和" biz_Type"。然后,存储过程将返回" biz_Number"。 根据" biz_abbrev"的值,存储过程将决定从两个表中搜索哪个表。每个表都有类似的列,包括上面的两个,即" comp_Name"和" biz_Type"。 biz_abbrev由应用程序生成,它生成" abbrev1"或" abbrev2"。 数据库中的两个表名为" Tbl_Avi"和" Tbl_Marine"。 以下是我的存储过程

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,即 表a Company_Name biz_Type biz_Number营业额    Comp1 AA 123 1000000    Comp1 AA 123 1200000    Comp2 AB 345 1230000    Comp2 AB 345 1450000

表b Company_Name biz_Type biz_Number营业额    Comp1 AA 123 1000000    Comp1 AA 124 1200000    Comp2 AB 345 1230000    Comp2 AB 346 1450000

表B不会运行但会显示错误

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 声明已经终止。

我如何在上述声明中使用EXISTS或IN?

1 个答案:

答案 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'