考虑这个小脚本的例子
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
的存储更新
它有两个参数:一个是CustomerId
,另一个是用户希望更新的商店名称(Store中的StoreName)。因此,在Customers
表中,记录(1,1)
表示客户1从Biggest Store
购买了一些内容。我想将两个参数传递给存储过程,如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作为第二个参数传递给存储过程,但我想知道这样做是否聪明/可行,将StoreName
作为第二个参数传递。假设这不是一个人为的场景,CustomerId
也必须作为参数传递。
答案 0 :(得分:5)
我认为这完成了你要做的事情,除了我已经删除了连接并在过程中声明了一个新变量,它根据用户输入的名称来获取商店的ID。然后它使用商店的ID更新表,即使用户没有输入商店ID(因为用户不知道这个,但系统会这样)。
当然,取决于你想要做什么,这仍然可能无效。
CREATE PROCEDURE spUpdateCustomerInformation
@CustomerID int
,@StoreName varchar(50)
AS
BEGIN
DECLARE @ID INT
SELECT @ID = StoreId FROM Stores WHERE StoreName = @StoreName
UPDATE Customers
SET StoreId = @ID
WHERE CustomerId = @CustomerID
END
更新,因为最初,我从我的数据库中复制并粘贴以测试它,然后将其复制回来尝试使用其他名称(不好主意)。
答案 1 :(得分:1)
由于您加入了Customers
与Stores
ON商店ID,c.storeID
将始终等于s.storeID
,
为了完成您正在尝试的内容,必须有第三个内连接,以找出您传入的@StoreName
的storeId。