【问题标题】:How to create a select, and then an update stored procedure in SQL Server 2012如何在 SQL Server 2012 中创建选择,然后更新存储过程
【发布时间】:2014-08-18 11:21:11
【问题描述】:

我正在尝试创建一个存储过程,它运行一个选择查询并提取一个 id(变量),然后对该 id 进行更新查询。任何帮助将不胜感激。

这就是我所拥有的:

CREATE PROCEDURE dbo.Lead_usp_getLead
    @LeadId int output
AS

   SELECT TOP 1  
       Leadid, LeadInitials, LeadFirstName, LeadSurname, 
       LeadHomeTelephoneNumber, LeadWorkTelephoneNumber,
       LeadCellularNumber, LeadEMailAddress, IsLocked, uploadedDate
   FROM 
       dbo.Lead
   WHERE 
       IsLocked = 'False'
   ORDER BY 
       uploadedDate;

   UPDATE dbo.Lead
   SET IsLocked = 'TRUE'
   WHERE LeadId = @LeadId

   DECLARE @leadid int

   EXEC dbo.Lead_usp_getLead @leadId;

【问题讨论】:

  • 那么您面临的问题是什么?
  • 选择查询运行但记录没有更新。

标签: sql stored-procedures sql-server-2012


【解决方案1】:

您可以将它们组合起来。无需进行两次查询:

with toupdate as (
      SELECT TOP 1 l.*
      FROM dbo.Lead l
      WHERE l.IsLocked = 'False'
      ORDER BY l.uploadedDate
     )
Update toupdate
    SET IsLocked = 'TRUE';

【讨论】:

【解决方案2】:

不明白你的最终结果,但是:

UPDATE dbo.Lead SET IsLocked = 'TRUE'
WHERE Leadid = (SELECT TOP 1 Leadid FROM dbo.Lead WHERE IsLocked = 'False')

【讨论】:

    【解决方案3】:

    如果创建存储过程的唯一目的是运行选择查询并提取 id(变量)并且不包含其他复杂的业务逻辑..那么您应该编写一个函数:

    IF OBJECT_ID (N'dbo.Lead_fn_getLead', N'FN') IS NOT NULL
        DROP FUNCTION dbo.Lead_fn_getLead;
    GO
    
    CREATE FUNCTION dbo.Lead_fn_getLead (@LeadId int)
    RETURNS int
    AS
    BEGIN 
       DECLARE @varLeadId int
    
       SELECT TOP 1  @varLeadId =  
           Leadid
       FROM 
           dbo.Lead
       WHERE 
           IsLocked = 'False'
       ORDER BY 
           uploadedDate;
    
     RETURN(@varLeadId);
    END;
    Go
    

    然后写 as 来更新表:

    DECLARE @leadid int
    SET @leadid = 1
    
    UPDATE dbo.Lead
    SET IsLocked = 'TRUE'
    WHERE LeadId = (Select dbo.Lead_fn_getLead(@leadid))
    
    Go
    

    Check demo here..

    【讨论】:

    • 非常感谢您的快速回复,这是我正在寻找的内容,但是如果您理解我的意思,我需要返回/显示 select 语句中的其他字段。跨度>
    • 除了IsLocked 之外没有其他列正在更新,因为 LeadId 将保持不变,IsLocked 将更新后的值 TRUE/FALSE 作为情况可能是..
    • 不幸的是,我只收到了 id,我怎样才能从那里检索该记录的其他数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多