sql – 存储过程使用参数更新来自不同表的列名

以一个小脚本为例

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也必须作为参数传递.

最佳答案
我认为这完成了你要做的事情,除了我已经删除了连接并在过程中声明了一个新变量,它根据用户输入的名称来获取商店的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

更新,因为最初,我从我的数据库复制和粘贴测试它,然后复制它尝试使用其他名称(坏主意).

转载注明原文:sql – 存储过程使用参数更新来自不同表的列名 - 代码日志