2014-01-17 31 views
0

我想獲取最新記錄的主鍵(auto_increment)以將其用作另一個表中的外鍵。當我使用SCOPE_IDENTITY()爲PDO參數,我得到的錯誤:帶主鍵和範圍標識的插入語句

Call to undefined function SCOPE_IDENTITY().

當我使用它作爲一個直接的值,該語句總是回滾。

我的代碼是否正確?

if (empty($errors)) { 
    $sqlconnection = new SqlConnection(); 

    $conn = $sqlconnection->db_connect(); 

    if ($conn) { 
     if (sqlsrv_begin_transaction($conn) === false) { 
      $errors[] = "Cant start transaction."; 
     } else { 
      // Query1 
      $query1 = "INSERT INTO [RC.table1] (terminname, datum) VALUES (?, ?)"; 
      $params1 = array($eventname, $eventdate); 
      $stmt1 = sqlsrv_query($conn, $query1, $params1); 

      //Query2 
      $query2 = "INSERT INTO [RC.table2] (appointment_id, mandant_id) VALUES ((SELECT SCOPE_IDENTITY()), ?)"; 
      $params2 = array($_SESSION['mandant_id']); 
      $stmt2 = sqlsrv_query($conn, $query2, $params2); 

      if($stmt1 && $stmt2) { 
       sqlsrv_commit($conn); 
       echo "Transaction committed.<br />"; 
      } else { 
       sqlsrv_rollback($conn); 
       echo "Transaction rolled back.<br />"; 
      } 
     } 
    } else { 
     $errors[] = "Cant connect to database."; 
    } 
} 
+0

嘗試使用@@ IDENTITY代替 – Sparky

+0

@Sparky:如果您要插入的表上有觸發器,建議不要使用'@@ IDENTITY' –

回答

1

嘗試這種解決方案:代替

$query2 = "INSERT INTO [RC.table2] (appointment_id, mandant_id) VALUES ((SELECT SCOPE_IDENTITY()), ?)"; 

與此:

$query2 = "DECLARE @LastID INT; SET @LastID = SCOPE_IDENTITY(); INSERT INTO [RC.table2] (appointment_id, mandant_id) VALUES (@LastID, ?)"; 

此外,對於@LastID變量定義(DECLARE @LastID INT)請使用相同的數據類型作爲appointment_id列的數據類型。在這個例子中,我認爲@LastID的類型是INT

編輯:您可以創建以下stored procedureTRY ... CATCH

CREATE PROCEDURE dbo.Insert_Table1Table2 
(
    @terminname NVARCHAR(50), 
    @datum DATE, 
    @mandant_id INT 
) 
AS 
BEGIN 
    BEGIN TRANSACTION; 

    BEGIN TRY 
     INSERT INTO [RC.table1] (terminname, datum) VALUES (@terminname, @datum) 
     DECLARE @appointment_id INT; 
     SET @appointment_id = SCOPE_IDENTITY(); 
     INSERT INTO [RC.table2] (appointment_id, mandant_id) VALUES (@appointment_id, @mandant_id) 
    END TRY 
    BEGIN CATCH 
    SELECT 
     DECLARE @ErrorMessage NVARCHAR(2048); 
     SET @ErrorMessage = ERROR_MESSAGE(); 
     RAISERROR(@ErrorMessage, 16, 1) 

     IF @@TRANCOUNT > 0 
      ROLLBACK TRANSACTION; 
    END CATCH; 

    IF @@TRANCOUNT > 0 
     COMMIT TRANSACTION; 
END 

注意:您要更換所有類型和最大。長度與正確的類型和長度。

+0

也回滾。這是一個正確的解決方案,當我從表中讀取最新的ID並添加+1並將其用於ID時? – mnlfischer

+0

號爲什麼不使用存儲過程?我將使用存儲過程來執行這些INSERT。 –

+0

我可以使用參數調用存儲過程嗎?我有第二次插入的會話變量。 – mnlfischer

-1

順便說一句,而代碼可能的工作,我建議以下變化...

$query1 = "INSERT INTO [RC.table1] (terminname, datum) VALUES (?, ?);select @@identy" 

現在,檢索的結果(這將是添加了新的密鑰),並通過它作爲下一個SQL調用的參數。

0
BEGIN TRAN T1; 
INSERT INTO [RC.table1] (terminname, datum) VALUES ('alibaba', '24.02.2014'); 
BEGIN TRAN T22 
INSERT INTO [RC.table2] (appointment_id, mandant_id) VALUES ((SELECT SCOPE_IDENTITY()), '0200') 
COMMIT TRAN T1; 
COMMIT TRAN T2; 

該工作室完美的作品。不知道,爲什麼我不能在PHP交易中獲得身份。

+0

爲什麼不在第二個中使用'SELECT SCOPE_IDENTITY()'查詢你的問題? –

+0

對不起更新了。 – mnlfischer

+0

您的問題中的代碼是否真的這樣做?它在哪裏實際上是'BEGIN TRAN T1;'和'BEGIN TRAN T22'? –