【问题标题】:Stored Procedure update with parameter a column name from a different table带有参数的存储过程更新来自不同表的列名
【发布时间】:2013-07-24 06:52:45
【问题描述】:

以这个小脚本为例

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

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    我认为这完成了你想要做的事情,除了我已经删除了连接并只是在过程中声明了一个新变量,它根据用户输入的名称获取商店的 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
    

    已更新,因为最初,我从数据库中复制并粘贴以对其进行测试,然后将其复制回来以尝试使用其他名称(坏主意)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这还没有超过我的最低要求。
      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2017-11-29
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多