Sql server 在SQL UDF中插入记录并返回Id?
我需要一个用户定义的函数来插入一个新记录并返回Id,这可能吗?我该怎么做 我已尝试使用insert语句创建函数,但出现以下错误:Sql server 在SQL UDF中插入记录并返回Id?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我需要一个用户定义的函数来插入一个新记录并返回Id,这可能吗?我该怎么做 我已尝试使用insert语句创建函数,但出现以下错误: Invalid use of the side-affecting operator 'INSERT' within a function. 我正在使用SQLServer2008 更新SQL: CREATE FUNCTION dbo.GetNewBookingReference() RETURNS int AS BEGIN INSERT INTO Booki
Invalid use of the side-affecting operator 'INSERT' within a function.
我正在使用SQLServer2008
更新SQL:
CREATE FUNCTION dbo.GetNewBookingReference()
RETURNS int
AS
BEGIN
INSERT INTO BookingReference
(CreatedTime, CreatedByUserId)
VALUES
(GETDATE()
,10)
RETURN @@IDENTITY
END
感谢在SQL Server中,用户定义的函数无法更改数据库状态。您将不得不使用带有
输出
参数的存储过程。您能告诉我们您有什么吗?作为旁白:我强烈建议使用SCOPE_IDENTITY()而不是@IDENTITY-如果您的表上碰巧有触发器,您可能最终从@@identityTanks获得了错误的ID marc刚刚读到的!
// Check if new identity is needed.
if (getId)
{
// Execute db specific autonumber or identity retrieval code
// SELECT SCOPE_IDENTITY() -- for SQL Server
// SELECT @@IDENTITY -- for MS Access
// SELECT MySequence.NEXTVAL FROM DUAL -- for Oracle
string identitySelect;
switch (DataProvider)
{
// Access
case "System.Data.OleDb":
identitySelect = "SELECT @@IDENTITY";
break;
// Sql Server
case "System.Data.SqlClient":
identitySelect = "SELECT SCOPE_IDENTITY()";
break;
// Oracle
case "System.Data.OracleClient":
identitySelect = "SELECT MySequence.NEXTVAL FROM DUAL";
break;
default:
identitySelect = "SELECT @@IDENTITY";
break;
}
command.CommandText = identitySelect;
id = int.Parse(command.ExecuteScalar().ToString());
}
// Check if new identity is needed.
if (getId)
{
// Execute db specific autonumber or identity retrieval code
// SELECT SCOPE_IDENTITY() -- for SQL Server
// SELECT @@IDENTITY -- for MS Access
// SELECT MySequence.NEXTVAL FROM DUAL -- for Oracle
string identitySelect;
switch (DataProvider)
{
// Access
case "System.Data.OleDb":
identitySelect = "SELECT @@IDENTITY";
break;
// Sql Server
case "System.Data.SqlClient":
identitySelect = "SELECT SCOPE_IDENTITY()";
break;
// Oracle
case "System.Data.OracleClient":
identitySelect = "SELECT MySequence.NEXTVAL FROM DUAL";
break;
default:
identitySelect = "SELECT @@IDENTITY";
break;
}
command.CommandText = identitySelect;
id = int.Parse(command.ExecuteScalar().ToString());
}