woo*_*gie 4 sql t-sql sql-server sql-server-2008
以一个小脚本为例
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)
Run Code Online (Sandbox Code Playgroud)
假设我想使用一个名为的存储更新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
Run Code Online (Sandbox Code Playgroud)
返回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
Run Code Online (Sandbox Code Playgroud)
更新,因为最初,我从我的数据库复制和粘贴测试它,然后复制它尝试使用其他名称(坏主意).