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

时间:2013-07-23 22:37:08

标签: 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(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也必须作为参数传递。

2 个答案:

答案 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)

由于您加入了CustomersStores ON商店ID,c.storeID将始终等于s.storeID

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