2009-08-01 6 views
2

新しいレコードを挿入してIDを返すためのユーザー定義関数が必要ですが、これは可能ですか?どのようにすればいいですか?レコードを挿入し、SQL UDFでIDを返しますか?

私はinsert文で関数を作成しようとしたが、私は次のエラーを取得しています:

CREATE FUNCTION dbo.GetNewBookingReference() 

RETURNS int 

AS 

BEGIN 

INSERT INTO BookingReference 
(CreatedTime, CreatedByUserId) 
VALUES 
    (GETDATE() 
    ,10) 

RETURN @@IDENTITY 

END 

Invalid use of the side-affecting operator 'INSERT' within a function. 

私は、SQL Server 2008の

UPDATEのSQLを使用しています

ありがとう

+0

あなたはあなたに何を持っていますか? –

+0

自分のSQLを追加しました –

+1

ちょうど脇に:@@ IDENTITYの代わりにSCOPE_IDENTITY()を使用することを強くお勧めします - テーブルにトリガがあると、間違ったIDが@@ IDENTITY –

答えて

8

SQL Serverでは、ユーザー定義関数データベースの状態を変更できません。 OUTPUTパラメーターを持つストアード・プロシージャーを使用する必要があります。

0
insert into table1(name, age) values('xyz', 2); 
select SCOPE_IDENTITY() as NewID; 
+0

-1:関数内にありません。 –

0
   // 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()); 
       } 
関連する問題