【问题标题】:Insert into using a Case Statement使用案例语句插入
【发布时间】:2019-08-08 05:35:33
【问题描述】:

我正在尝试使用带有一个参数的存储过程将数据插入表中。该参数正在寻找俱乐部的名称。我希望 SP 找到属于该俱乐部的所有球员并将他们插入到 ClubNameTable 中。问题是当我运行 SP 时,它会将连接中的所有数据插入到表中,而不仅仅是当 case 语句为真时。

CREATE PROCEDURE SSIS.usp_ClubNameTable 
    -- Add the parameters for the stored procedure here
    @NameOfClub nvarchar(200)
AS
BEGIN
    TRUNCATE TABLE SSIS.ClubNameTable;
    insert into ssis.ClubNameTable ([NameOfClub], [FirstName], [LastName])
        SELECT
            p.FirstName,
            COUNT(p.LastName) as 'Number of Last Names',                
            CASE
                WHEN @NameOfClub = 'Eagle Plate' THEN NameOfClub
                WHEN @NameOfClub = 'Atlanta United FC' THEN NameOfClub
                    ELSE 'Please choose either Eagle Plate or Atlanta United FC'
                end
    FROM [Location].Club as C
            JOIN [Location].ClubDetails as CD on c.ClubID = cd.ClubID
            JOIN [Player].Player as P on CD.PlayerID = P.PlayerID
            GROUP BY c.NameOfClub, p.FirstName, p.LastName
            ORDER BY p.LastName ASC
        declare 
        @RowCount int
            SET @RowCount = (SELECT COUNT(*) FROM Location.Club)
END
GO

【问题讨论】:

  • 请提供表格架构和 SP 代码。
  • 如果没有实际看到存储过程的代码、示例数据和预期输出,很难判断问题是什么,请您提供这些吗?
  • 对不起,我没有输入代码就按了 Enter,只是编辑了它。还有什么能让它更清楚的吗?
  • 不要在表之间复制数据。每个玩家只能在数据库中存储一次。
  • 这看起来像业务逻辑。在将其发送到 sql 之前执行此逻辑会更容易吗?

标签: sql database tsql case conditional-statements


【解决方案1】:

在列上使用case statement 不会对记录进行任何过滤,它只是将条件应用于要分配给列的值。为了过滤记录,您需要使用带有所需条件的where 子句:

 CREATE PROCEDURE SSIS.usp_ClubNameTable 
    -- Add the parameters for the stored procedure here
    @NameOfClub nvarchar(200)
AS
BEGIN
    TRUNCATE TABLE SSIS.ClubNameTable;
    if(@NameOfClub = 'Eagle Plate' or @NameOfClub = 'Atlanta United FC')
    begin
    insert into ssis.ClubNameTable ([NameOfClub], [FirstName], [LastName])
        SELECT
            p.FirstName,
            COUNT(p.LastName) as 'Number of Last Names',                
            NameOfClub
    FROM [Location].Club as C
            JOIN [Location].ClubDetails as CD on c.ClubID = cd.ClubID
            JOIN [Player].Player as P on CD.PlayerID = P.PlayerID
            Where C.NameOfClub = @NameOfClub
            GROUP BY c.NameOfClub, p.FirstName, p.LastName
            ORDER BY p.LastName ASC
        declare 
        @RowCount int
            SET @RowCount = (SELECT COUNT(*) FROM Location.Club)
    end

    else
    begin
    select 'Please choose either Eagle Plate or Atlanta United FC'
    end
END
GO

【讨论】:

  • 谢谢,但这似乎对我不起作用。当我运行这个 SP 时,我输入的参数并不重要,目标表总是包含两个俱乐部的混合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2013-09-23
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多