2013-04-17 18 views
7

Po dodaniu kolumny obliczeniowej do tabeli w programie SQL Server 2005 otrzymuję następujący komunikat na INSERT, tylko za pośrednictwem PHP (przy użyciu PDO) to działa dobrze w SQL Server Managment Studio.Błąd 1934 serwera SQL pojawia się na INSERT do tabeli z kolumną obliczoną PHP/PDO

Aby upewnić się, że wszystko jest poprawne, skonfigurowałem śledzenie za pomocą programu SQL Server Profiler i skopiowałem/wkleiłem instrukcję INSERT do SQL Server Managment Studio. To działało dobrze w SSMS, ale nadal kończy się niepowodzeniem w PHP.

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

Odpowiedz

8

Okazało się, że problem dotyczył parametrów SET. Użyłem poniższego kodu uzyskanego z Here. Aby ustalić, które opcje zostały ustawione w SQL Server Management Studio (gdzie wstawka działała). Następnie umieszczenie każdego z nich w exec przed moją instrukcją insert sprawiło, że rzeczy znowu działają. Nie musiałem przechowywać wszystkich opcji, więc poniżej pokazuję te, które były wymagane, aby działały.

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' 

Oto opcje skończyło się na konieczności:

$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"); 

Aktualizacja: Wydaje ograniczenia FK spowodowało następującego błędu. Powyższy błąd również naprawił.

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

5

Po odpowiedzi @kackleyjm próbowałem aktywować mniej możliwych opcji.

skończyło się z:

SET ANSI_WARNINGS ON 
SET ANSI_PADDING ON 
SET CONCAT_NULL_YIELDS_NULL ON 

To załatwiło sprawę dla mnie

+0

Może zajść potrzeba zapisania ustawień za pomocą PHP. Przykład: $ dbPDO-> exec ("USTAW ANSI_WARNINGS ON"); – jjwdesign

+0

Gdzie to położę? W konkretnym pliku lub na serwerze? – bleykFaust

0

Znalazłem ten problem pojawia się, gdy robisz insert luzem lub aktualizację przy użyciu XML w sql server. Odkryłem, że ten problem dotyczy problemu z indeksowaniem w tabeli. W górnej części treści procedury sprawdź:

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

. To rozwiąże błąd "1934".