问题标题是什么。使用SELECT @@IDENTITY AS ins_id
之类的查询,我是否需要提供表名或任何其他信息来指定我正在谈论的表/数据库?
答案 0 :(得分:16)
@@IDENTITY
返回当前会话中生成的最新标识。在大多数情况下,您可能希望使用SCOPE_IDENTITY
代替,它会返回当前范围内生成的最新标识。
例如,如果您在 table1 中插入一行,但该插入会触发一个将行插入 table2 的触发器,那么@@IDENTITY
将返回来自 table2 的身份,而SCOPE_IDENTITY
将从 table1 返回身份。
INSERT INTO my_table (my_column) VALUES ('test')
-- return the identity of the row you just inserted into my_table
-- regardless of any other inserts made by triggers etc
SELECT SCOPE_IDENTITY() AS ins_id
答案 1 :(得分:1)
没有;它的工作原理与mysql中的SELECT LAST_INSERT_ID()非常相似,检索插入的最后一个标识值。您可能需要查看this in-depth examination,了解有关您可能需要关注的内容的更多信息。
答案 2 :(得分:1)
以下是基于Joomla代码的代码片段。 $ dbh是数据库连接(mssql_connect()的结果)。如果传递$ keyName参数,则更新密钥名称(ID)。
此代码使用MSSQL关键字“OUTPUT”来获取插入值的ID(或任何所需值)。
function mssql_insertObject($table, &$object, $keyName = NULL)
{
global $dbh;
if($keyName) {
$fmtsql = 'INSERT INTO '. $table .' ( %s ) OUTPUT INSERTED.' . $keyName . ' VALUES ( %s ) ';
}
else {
$fmtsql = 'INSERT INTO '. $table .' ( %s ) VALUES ( %s ) ';
}
$fields = array();
foreach (get_object_vars( $object ) as $k => $v) {
if (is_array($v) or is_object($v) or $v === NULL) {
continue;
}
if ($k[0] == '_') { // internal field
continue;
}
$fields[] = $k;
$values[] = "'" . str_replace("'", "''", $v) . "'";
}
$sql = sprintf( $fmtsql, implode( ",", $fields ) , implode( ",", $values ) );
$query = mssql_query($sql, $dbh);
if($query === false) {
return false;
}
if(is_resource($query))
{
if($keyName) {
$id = mssql_result($query, 0, 0);
if($id) {
$object->$keyName = $id;
}
}
mssql_free_result($query);
}
return true;
}