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
更新是因为最初,我从数据库复制并粘贴来测试它,然后尝试使用其他名称将它复制回来(坏主意)。这没有超出我的最小值。