2013-07-23 21 views
4

列名考慮這個腳本爲例與參數存儲過程更新從不同的表

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)。因此,在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也必須作爲參數傳遞。

回答

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

既然你與Stores ON STOREID加入Customersc.storeID將始終等於s.storeID

爲了完成你嘗試什麼,必須有第三個內部連接,找出了@StoreName的STOREID你正在通過。

+0

這還沒有穿過我的分鐘。 – wootscootinboogie