【问题标题】:SQL Server - update multiple records using a stored procedureSQL Server - 使用存储过程更新多条记录
【发布时间】:2018-11-05 18:23:52
【问题描述】:

作为这方面的超级新手,我希望得到一些指导。

我需要比较两组数据并用一个值更新一组数据。这是我目前所拥有的。

PROCEDURE [dbo].[update_personnel_rank]
AS
    DECLARE @frsid VARCHAR
    DECLARE @officerid VARCHAR
    DECLARE @hrrank VARCHAR
    DECLARE @personnelrank VARCHAR
    DECLARE @farank VARCHAR

    DECLARE @rank VARCHAR(150)

    SET @rank = 'Admin Spec II'
BEGIN
    SET NOCOUNT ON;

    SELECT
        @frsid = hr.FRSID, 
        @officerid =  p.OfficerID,
        @hrrank =  hr.Rank,
        @personnelrank = p.Rank, 
        @farank =  r.FA_Rank
    FROM 
        [FireApp_REPL_DW_Data].[dbo].[MCFRSCombinedPersonnelandPimsStaff] hr 
    INNER JOIN
        [fh_reports].[dbo].[personnel_bk] p ON p.OfficerID = hr.FRSID
    INNER JOIN
        [fh_reports].[dbo].[Rank_Lookup_tbl] r ON r.FA_Rank = hr.Rank
    WHERE
        (p.rank <> hr.Rank OR p.rank = '')
        AND p.Rank = @rank

    UPDATE [fh_reports].[dbo].[personnel_bk]
    SET Rank = @farank
    WHERE OfficerID =  @officerid
END
GO

选择查询返回 3 条记录,此存储过程运行没有任何错误,但它不更新记录。由于选择查询返回3条记录,我想我需要相应地更改参数设置,但不知道如何......

【问题讨论】:

  • 你为什么不简单地用 JOIN 更新你的表
  • 在SELECT执行后打印@officerid的值。
  • Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar 变量和参数提供一个长度!如果您将变量定义为 VARCHAR,您将获得一个最大长度为正好 1 个字符的变量 - 通常不是您想要的!

标签: sql-server stored-procedures sql-update multiple-records


【解决方案1】:

@Sami 指出,如果您不返回这些变量,则无需设置它们,只需运行更新即可:

USE [YourDatabase]
GO

SET NOCOUNT ON
GO

ALTER PROCEDURE [dbo].[update_personnel_rank]
    @rank VARCHAR(150) --= 'Admin Spec II'
AS 

BEGIN

    IF @rank IS NULL OR @rank = ''
        RAISERROR('Please enter a valid rank string.', 16, 1)

    UPDATE hr
        SET [Rank] = r.FA_Rank
    FROM    [FireApp_REPL_DW_Data].[dbo].[MCFRSCombinedPersonnelandPimsStaff]   [hr]
        INNER JOIN [fh_reports].[dbo].[personnel_bk]                            [p]
            ON [p].[OfficerID] = [hr].[FRSID]
        INNER JOIN [fh_reports].[dbo].[Rank_Lookup_tbl]                         [r]
            ON [r].[FA_Rank] = [hr].[Rank]
    WHERE [p].[rank] <> [hr].[Rank]
        AND ([p].[Rank] = @rank OR p.[Rank] = '')

END ;
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多