2013-07-23 2 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이고 다른 하나는 사용자가 업데이트하고자하는 상점의 이름입니다 (상점 테이블의 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

당신이 때 storeID ON StoresCustomers에 가입되어 있기 때문에, c.storeID 항상 동일한 s.storeID

당신이 시도하고있는 무슨을 달성하기 위하여이의 @StoreName의 세 번째 내부 조인 파악하기에 storeId가 있어야합니다 당신은 통과하고있다.

+0

이것은 내 분을 넘지 않았습니다. – wootscootinboogie

관련 문제