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 ,它带有两个参数:一个是 the CustomerId,另一个是用户希望更新的商店的名称(来自 Stores 表的 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也必须作为参数传递。

4

2 回答 2

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

更新是因为最初,我从我的数据库中复制并粘贴以对其进行测试,然后将其复制回来以尝试使用其他名称(坏主意)。

于 2013-07-23T22:47:40.697 回答
1

由于您Customers使用StoresON storeID 加入,c.storeID因此将始终等于s.storeID,

为了完成您尝试的操作,必须有第三个内部连接,以找出@StoreName您传入的 storeId。

于 2013-07-23T22:43:55.037 回答