2012-03-05 19 views
0

SQL Server 2005でストアドプロシージャを作成しようとしています。行が存在する場合は、その行のMerchantIDが返されます。それ以外の場合は、CompanyName、City、StateをチェックしてMerchanTIDを取得します。それ以外の場合は何も表示されません。しかし、私はこのエラーが出ている "サブクエリが1つ以上の値を返しましたサブクエリが次のように続く場合、これは許可されません ' CheckifMerchantexistsのプロシージャは、NULLのステータスを返そうとしましたが、許可されません。代わりに0のステータスが返されます。ご協力いただきありがとうございます。sqlクエリで2つ以上の値のサブクエリが返されました

ALTER PROCEDURE [dbo].[CheckifMerchantexists] 
(@CompanyName varchar(50) 
,@Phone varchar(15) 
,@City varchar(30) 
,@State varchar(2) 
) 

AS 
BEGIN 

declare @MerchantID int 
set @MerchantID = (Select MerchantID from Merchant where Phone = @Phone) 


IF @MerchantID = null 
Begin 
    set @MerchantID = (Select MerchantID from Merchant where CompanyName = @CompanyName and City = @City and State = @State) 
    return @MerchantID 
END 
else 
Begin 
    return @MerchantID 
End 
+0

は、あなたが複数の商人を持っていることを期待します同じ電話で?そうでない場合は、おそらく制約を追加するか、PhoneをMerchantテーブルにプライマリキーにする必要があります。 – Khan

答えて

0

あなたは

set @MerchantID = (Select MerchantID from Merchant where Phone = @Phone) 

Select @MerchantID = MerchantID from Merchant where Phone = @Phone 

でそれを交換してください。しかし、複数の商人は、同じ携帯電話を持っている場合は、結果を期待されないことがありますのでご注意使用し、ここで「設定」する必要はありません。数。あなたのロジックを変更することを検討する必要があります。

+0

ジェフ、そうです、私はロジックを変えるべきです。ありがとう!! – Ram

1

あなただけのいずれかが存在するかどうかを確認したいので、彼らは(もしあれば)一つだけを返すように、あなたの選択を変更します。

例えば:

set @MerchantID = (Select TOP 1 MerchantID from Merchant where Phone = @Phone) 

TOP-Clause

あなたを@MerchantIDのタイプがintの場合、複数の販売者にPhone = @Phoneがある場合は、テーブルを取得します。テーブルをintに変換することはできません。

これが理由です。 =、!=、<、< =、>、> =またはサブクエリが式として使用されている場合、サブクエリは1つ以上の値を返しました "

0

指定された会社名、都市名、州名のデータベース。これは、1つの値が返されたときにのみ代入が機能するため、2番目の選択に失敗します。

0

あなたの最初の問題は、TimまたはJeffが上記のように対処することができます。

指定された条件に基づいてマーチャントが見つからない場合に、ストアドプロシージャからNULL値を返そうとすると、2番目のエラーメッセージ(nullが0に変更されます)が発生します。 RETURNの値は整数でなければなりません。

SETを使用すると、サブクエリが行を返さない場合は変数NULLになります。 Jeffが言及しているSELECT @MerchantID=MerchantID ...メソッドを使用する利点の1つは、返された行がない場合は、変数にまったく影響しないということです。これは、手順の最初に@MerchantIDのデフォルト値を割り当てることができます(多分0または-1)、その後、何も見つからなかった場合はそのように、返されることがあります。

DECLARE @MerchantID int 
SET @MerchantID = 0 

SELECT @MerchantID=MerchantID from Merchant where Phone = @Phone 

IF @MerchantID = 0 
BEGIN 
    SELECT @MerchantID=MerchantID from Merchant where CompanyName = @CompanyName and City = @City and State = @State 
END 

RETURN @MerchantID 
関連する問題