Sql server 在SQL UDF中插入记录并返回Id?

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

我需要一个用户定义的函数来插入一个新记录并返回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 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());
                }