tsql:“返回选择”可以在“更新”之前来吗?

时间:2011-10-23 16:22:58

标签: sql sql-server tsql

我想编写一个t-sql存储过程(aka sproc),它从'MyTable'中选择3列。另外,我想在同一个sproc中更新表:

  1. 我从表中选择第三个值。
  2. 如果它等于'true',我想将表中的相关记录更新为'false'
  3. 我不确定我应该使用什么语法。你能救我一下吗?

    ALTER procedure [dbo].[My_PROC]
        @ID varchar(10)
    AS
    BEGIN
    
        declare @Col3 bit;
    
        set @Col3 = select Col3
        from dbo.MyTable  with (nolock)
        where @ID = ID
    
    
        if @Col3 = 'true'  
            update dbo.dbo.MyTable set col3 = 'false'
            where @ID = ID
    
        select Col1, 
        Col2, 
        Col3
        from dbo.MyTable table  with (nolock) where @ID = ID,
        table.Col1,
        table.Col2,
        @Col3   
    END
    

    编辑:我想返回原始Col3 (不是更新后的值)。

2 个答案:

答案 0 :(得分:1)

使用:

ALTER procedure [dbo].[My_PROC]
    @ID varchar(10)
AS
BEGIN

    SELECT t.col1, 
           t.col2, 
           t.col3
      FROM dbo.MyTable AS t WITH (NOLOCK)
     WHERE t.id = @ID

    -- No need for an IF statement to determine updating...
    UPDATE dbo.dbo.MyTable 
       SET col3 = 'false'
     WHERE id = @ID
       AND t.col3 = 'true'

END

我不知道您对最终SELECT的意图是什么,但是一旦我理解了您的意图,我就可以更新它。

答案 1 :(得分:0)

如果您使用的是SQL Server 2005或更高版本,则可以使用OUTPUT子句输出原始值(如果查询实际更新了该值)。但是,如果查询未更新行,OUTPUT将不会为您提供原始值。

    declare @t table (
      ID int,
      tf bit
    );

    insert into @t values
      (1,0),
      (2,1),
      (3,0);

    declare @ID int = 2;

    select * from @t

    update @t set
      tf = 0
    output deleted.ID, deleted.tf
    where ID = @ID;

    select * from @t;