Sql 使用不同表中的列名更新存储过程参数

Sql 使用不同表中的列名更新存储过程参数,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,以这个小脚本为例 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(S

以这个小脚本为例

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
,另一个是用户希望更新的商店名称(Stores表中的StoreName)。因此,在
客户
表中,记录
(1,1)
表示客户1从
最大的商店
购买了东西。我想将两个参数传递给存储过程,如
spUpdateCustomerInformation 1,'minimest 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
也必须作为一个参数传递。

由于您将
客户
加入storeID上的
商店
c.storeID
将始终等于
s.storeID


为了完成您正在尝试的操作,必须有第三个内部联接,以计算您传入的
@StoreName
的storeId

我认为这就完成了您想要做的事情,除了我删除了连接,并在过程中声明了一个新变量,它根据用户输入的名称获取存储的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

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

这没有超出我的最小值。