2013-04-17 26 views
7

將計算列添加到SQL Server 2005中的表後我在INSERT上收到以下消息,僅通過PHP(使用PDO),它工作正常SQL Server管理工作室。在計算列PHP/PDO的INSERT表上插入SQL Server錯誤1934

爲了確保我的一切正確,我使用SQL Server Profiler設置了跟蹤,並將INSERT語句複製/粘貼到SQL Server Managment Studio中。它在SSMS中運行得很好,但在PHP中仍然失敗。

Error adding contact: SQLSTATE[HY000]: General error: 1934 General SQL Server error: Check messages from the SQL Server [1934] (severity 16) [(null)]

回答

8

原來問題與SET參數有關。我用下面的代碼從Here獲得。確定在SQL Server Management Studio中設置了哪些選項(插入的工作位置)。然後,在我的插入語句之前將其中的每一個放在一個exec中,都會使事情再次起作用。我不需要保留所有的選項,所以下面我會展示讓它工作所需的選項。

DECLARE @options INT 
SELECT @options = @@OPTIONS 

PRINT @options 
IF ((1 & @options) = 1) PRINT 'DISABLE_DEF_CNST_CHK' 
IF ((2 & @options) = 2) PRINT 'IMPLICIT_TRANSACTIONS' 
IF ((4 & @options) = 4) PRINT 'CURSOR_CLOSE_ON_COMMIT' 
IF ((8 & @options) = 8) PRINT 'ANSI_WARNINGS' 
IF ((16 & @options) = 16) PRINT 'ANSI_PADDING' 
IF ((32 & @options) = 32) PRINT 'ANSI_NULLS' 
IF ((64 & @options) = 64) PRINT 'ARITHABORT' 
IF ((128 & @options) = 128) PRINT 'ARITHIGNORE' 
IF ((256 & @options) = 256) PRINT 'QUOTED_IDENTIFIER' 
IF ((512 & @options) = 512) PRINT 'NOCOUNT' 
IF ((1024 & @options) = 1024) PRINT 'ANSI_NULL_DFLT_ON' 
IF ((2048 & @options) = 2048) PRINT 'ANSI_NULL_DFLT_OFF' 
IF ((4096 & @options) = 4096) PRINT 'CONCAT_NULL_YIELDS_NULL' 
IF ((8192 & @options) = 8192) PRINT 'NUMERIC_ROUNDABORT' 
IF ((16384 & @options) = 16384) PRINT 'XACT_ABORT' 

這裏是我最終需要的選項:

$dbPDO->exec("SET ANSI_WARNINGS ON");                    
$dbPDO->exec("SET ANSI_PADDING ON"); 
$dbPDO->exec("SET ANSI_NULLS ON"); 
$dbPDO->exec("SET QUOTED_IDENTIFIER ON"); 
$dbPDO->exec("SET CONCAT_NULL_YIELDS_NULL ON"); 

更新: 看來FK約束導致下面的錯誤。上面解決了這個錯誤。

SQLSTATE[HY000]: General error: 8624 General SQL Server error: Check messages from the SQL Server [8624] (severity 16) [(null)]

5

正在關注@kackleyjm答案我嘗試激活的選項越少越好。

我結束了:

SET ANSI_WARNINGS ON 
SET ANSI_PADDING ON 
SET CONCAT_NULL_YIELDS_NULL ON 

這奏效了,我

+0

您可能需要使用PHP編寫設置。例如:$ dbPDO-> exec(「SET ANSI_WARNINGS ON」); – jjwdesign

+0

我會把這個放在哪裏?在特定的文件或服務器上? – bleykFaust

0

我發現當你在sql server使用XML批量插入或更新出現這個問題。我發現這個問題是關於索引表中的問題。檢查

`IF (SELECT SESSIONPROPERTY('ARITHABORT')) = 0 and SET ARITHABORT ON;` 

位於過程主體的頂部。這將解決"1934"錯誤。