【问题标题】:How to output the temporary table's values upon INSERT?如何在 INSERT 时输出临时表的值?
【发布时间】:2020-05-26 16:12:45
【问题描述】:

我有以下疑问:

DECLARE @NewLoan TABLE (
[MemberSSN]         varchar(11),
[VolumeID]      int,
[LoanDate]         datetime
)
INSERT INTO LOAN (MemberSSN, VolumeID, LoanDate) OUTPUT inserted.MemberSSN, inserted.VolumeID, 
inserted.LoanDate INTO @NewLoan
VALUES ('488-40-', 6, GETUTCDATE())

因为LOAN 表有一个触发器,我不能OUTPUT 不将数据INTO 放在一个临时表中。现在,在执行查询后,我想SELECT@NewLoan 表的内容,而不是消息“(1)行已添加”,看看添加了什么。我该怎么做?

【问题讨论】:

  • SELECT * FROM @NewLoan; 有什么问题...?另外,这不是临时表,而是表变量。表变量和临时表是完全不同的对象。
  • @Larnu 哇...这很尴尬。我本可以发誓我尝试过但给了我一个错误。非常感谢,不过!

标签: sql-server triggers insert


【解决方案1】:

如果您的意思是希望前端读取它,那么您可以使用返回结果集的任何方法来运行查询:

DECLARE @NewLoan TABLE (
[MemberSSN]         varchar(11),
[VolumeID]      int,
[LoanDate]         datetime
);
INSERT INTO LOAN (MemberSSN, VolumeID, LoanDate)
OUTPUT inserted.MemberSSN, inserted.VolumeID, inserted.LoanDate INTO @NewLoan
VALUES ('488-40-', 6, GETUTCDATE());
SELECT * FROM @NewLoan

如果这被用于例如C# 然后 ExecuteReader 吧,或者 DataAdapter.Fill,或者 Dapper.Query 等等。

【讨论】:

  • 没错!这就是它的用途。
  • 您也可以跳过表变量并执行INSERT INTO t (cols) VALUES(vals); SELECT * FROM t WHERE ID = SCOPE_IDENTITY(); 尽管我必须承认我对您的情况有点困惑;你似乎知道除了日期之外的一切——这一切真的只是为了从服务器中选择日期吗?我本来希望输出子句输出一个您不知道的主键(假设 SSN 不是 PK),这就是为什么我们通常在 C# 中使用类似这样的构造的原因;将一些值发送到数据库,从数据库下载所有值,包括生成的 PK、日期或其他内容等
  • SSN 确实是主键。我想返回这两个值,所以最终,当 UI 完成后,我将输出这本书以及它被借给的人。不过,谢谢你的提示!使查询更加清晰。
  • 没有问题!当然,这对单次插入很有用;如果您正在执行多行插入,例如INSERT INTO t SELECT cols FROM otherT WHERE ... 和导致插入 10 行的选择等,则需要您的原始方式。如果您当然知道 PK,那么您可以选择使用它而不是 SCOPE_IDENTITY (这是典型的;y 用于插入应用程序不知道的生成身份)
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多