【问题标题】:SQL: Update a row and returning a column value with 1 querySQL:使用 1 个查询更新一行并返回一列值
【发布时间】:2010-10-16 14:13:36
【问题描述】:

我需要更新表中的一行,并从中获取一个列值。我可以这样做

UPDATE Items SET Clicks = Clicks + 1 WHERE Id = @Id;
SELECT Name FROM Items WHERE Id = @Id

这会生成 2 个对表的计划/访问。是否可以在 T-SQL 中修改 UPDATE 语句以更新并返回仅具有 1 个计划/访问权限的 Name 列?

我正在使用 C#、ADO.NET ExecuteScalar()ExecuteReader() 方法。

【问题讨论】:

    标签: c# sql-server tsql ado.net


    【解决方案1】:

    你想要OUTPUT 子句

    UPDATE Items SET Clicks = Clicks + 1
    OUTPUT INSERTED.Name
    WHERE Id = @Id
    

    【讨论】:

    • 以上,是的。使用 SQL Server 2000,请参阅 Learning 的响应
    • IIRC,OUTPUT 子句是作为 SQL Server 2005 Service Broker 的一部分引入的 - msdn.microsoft.com/en-us/library/ms345108.aspx
    • 谢谢,如何从 ExecuteNonQuery 检索输出参数?
    • 问题引用了ExecuteReader ;-p 对于ExecuteNonQuery,假设只有1行,那么可能是Learning提到的方法。
    • OUTPUT 对触发器感到不安。非常广泛地拒绝它。
    【解决方案2】:

    只访问一次表:

    DECLARE @Name varchar(MAX);
    
    UPDATE Items SET Clicks = Clicks + 1 , @Name = Name WHERE Id = @Id;
    SELECT @Name;
    

    【讨论】:

    • Marc 的方法要好得多,因为我的查询固有地假设一个 Id 有一个名称,可能/不正确。
    • 这种方法不需要使用表变量。
    • 这种方法要好得多,因为它不依赖于表触发器。
    • 对于单一的结果,这是非常聪明的。谢谢。
    • 与 TOP (1) 一起使用并获得受影响的行 ID (PK) 的好方法
    【解决方案3】:

    如果您使用的是 SQL Server 2005 及更高版本,OUTPUT clause 非常适合此操作

    【讨论】:

      【解决方案4】:

      为此使用存储过程。

      【讨论】:

        【解决方案5】:

        创建一个以@id 作为参数的存储过程,并同时完成这两件事。然后使用DbDataAdapter 调用存储过程。

        【讨论】:

          【解决方案6】:

          我无法更新并返回一行在选择语句中。即您不能使用其他答案中的选定值。

          就我而言,我想在查询中使用选定的值。我想出的解决方案是:

          declare @NextId int
          set @NextId = (select Setting from Settings where key = 'NextId')
          
          select @NextId + ROW_NUMBER() over (order by SomeColumnOfYourTable) from YourTable
          
          update Settings set Setting = Setting + @@ROWCOUNT 
          where key = 'NextId'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-07-31
            • 1970-01-01
            • 2015-01-08
            • 1970-01-01
            • 1970-01-01
            • 2014-01-15
            • 1970-01-01
            相关资源
            最近更新 更多