以前只用过在insert完以后利用select @@IDENTITY返回主键ID,最近在做微信公众平台,遇到一个需求是在帮绑定万微信openid后自动完成登陆,这就需要update以后返回主键ID,查了一些资料找到了output这一解决方案。
update [SmartPromoter] set [Name]='aaaaaaaa' output DELETED.[ID] where [Mobile]='18669698888'
经测试,insert、update、delete都可以返回主键ID
查了一下msdn关于output的用法:以下为msdn上的用法
返回受 INSERT、UPDATE、DELETE 或 MERGE 语句影响的各行中的信息,或返回基于受这些语句影响的各行的表达式。 这些结果可以返回到处理应用程序,以供在确认消息、存档以及其他类似的应用程序要求中使用。 也可以将这些结果插入表或表变量。 另外,您可以捕获嵌入的 INSERT、UPDATE、DELETE 或 MERGE 语句中 OUTPUT 子句的结果,然后将这些结果插入目标表或视图。
注意 |
---|
对于具有 OUTPUT 子句的 UPDATE、INSERT 或 DELETE 语句,即使在遇到错误需要回滚时,也会将行返回到客户端。 如果在运行语句的过程中出现任何错误,都不应使用该结果。 |
用在以下语句中:
适用范围:SQL Server(SQL Server 2008 至当前版本),Azure SQL Database。 |
<OUTPUT_CLAUSE> ::= { [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ] [ OUTPUT <dml_select_list> ] } <dml_select_list> ::= { <column_name> | scalar_expression } [ [AS] column_alias_identifier ] [ ,...n ] <column_name> ::= { DELETED | INSERTED | from_table_name } . { * | column_name } | $action
-
@table_variable
-
指定一个 table 变量,返回的行将插入此变量,而不是返回给调用方。 @ table_variable 必须在 INSERT、UPDATE、DELETE 或 MERGE 语句前声明。
如果未指定 column_list,则 table 变量必须与 OUTPUT 结果集具有相同的列数。 标识列和计算列除外,这两种列必须跳过。 如果指定了column_list,则任何省略的列都必须允许 Null 值,或者都分配有默认值。
有关 table 变量的详细信息,请参阅 表 (Transact-SQL)。
output_table
-
指定一个表,返回的行将被插入该表中而不是返回到调用方。 output_table 可以为临时表。
如果未指定 column_list,则表必须与 OUTPUT 结果集具有相同的列数。 标识列和计算列例外, 必须跳过这两种列。 如果指定了column_list,则任何省略的列都必须允许 Null 值,或者都分配有默认值。
output_table 无法应用于以下情况:
-
具有启用的对其定义的触发器。
-
参与 FOREIGN KEY 约束的任意一方。
-
具有 CHECK 约束或启用的规则。
column_list
-
-
INTO 子句目标表上列名的可选列表。 它类似于 INSERT 语句中允许使用的列列表。
scalar_expression
-
可取计算结果为单个值的任何符号和运算符的组合。 scalar_expression 中不允许使用聚合函数。
对修改的表中的列的任何引用都必须使用 INSERTED 或 DELETED 前缀限定。
column_alias_identifier
-
用于引用列名的代替名称。
DELETED
-
指定由更新或删除操作删除的值的列前缀。 以 DELETED 为前缀的列反映了 UPDATE、DELETE 或 MERGE 语句完成之前的值。
不能在 INSERT 语句中同时使用 DELETED 与 OUTPUT 子句。
INSERTED
-
列的前缀,指定由插入操作或更新操作添加的值。 以 INSERTED 为前缀的列反映了在 UPDATE、INSERT 或 MERGE 语句完成之后但在触发器执行之前的值。
INSERTED 语句不能与 DELETE 语句的 OUTPUT 子句同时使用。
from_table_name