5

例として、この小さなスクリプトを検討してください

create table Customers
(CustomerId int not null
,StoreId int
,primary key(CustomerId)
)
go
create table Stores
(StoreId int
,StoreName varchar(50)
,primary key(StoreId)
)
go
alter table Customers
add foreign key (StoreId)
references Stores(StoreId)
go

insert into Stores
values   (1,'Biggest Store')
        ,(2,'Mediumest Store')
        ,(3,'Smaller Store')
        ,(4,'Smallest Store')
go
insert into Customers
values
         (1,1)
        ,(2,1)
        ,(3,2)
        ,(4,3)
        ,(5,4)

spUpdateCustomerInformation 2 つのパラメーターを取るストアド アップデートを使用するとします。1 つはCustomerIdユーザーが更新したいストアの名前 (Stores テーブルの StoreName) です。したがって、Customersテーブルのレコード(1,1)は、顧客 1 が から何かを購入したことを意味しますBiggest Store。ストアド プロシージャのように 2 つのパラメータをストアド プロシージャに渡したいと思い spUpdateCustomerInformation 1,'Smallest Store'ます。私の試み(1,1)(1,4)

create proc spUpdateCustomerInformation
 @CustomerId int
,@StoreName varchar(50)
as begin
update c
set c.StoreId = s.StoreId
from customers as c
inner join Stores as s
on s.StoreId = c.StoreId
where c.CustomerID = @CustomerId
      and s.StoreName = @StoreName --failing here
end

更新された 0 行を返します。StoreId を 2 番目のパラメーターとしてストアド プロシージャに単純に渡すことができることはわかっていますが、StoreName2 番目のパラメーターとして を渡して、この方法でそれを行うのがスマート/可能かどうか疑問に思っていました。これは不自然なシナリオではなくCustomerId、パラメーターとしても渡す必要があることに注意してください。

4

2 に答える 2

1

ON storeID でご入会Customersされますので、常に と等しくなり、Storesc.storeIDs.storeID

あなたが試みていることを達成するために、@StoreNameあなたが渡しているのstoreIdを把握するために、3番目の内部結合が必要です.

于 2013-07-23T22:43:55.037 に答える