2013-04-17 27 views
7

Sau khi thêm cột được tính vào bảng trong SQL Server 2005, tôi nhận được thông báo sau trên INSERT, chỉ thông qua PHP (sử dụng PDO) SQL Server Managment Studio.Lỗi máy chủ SQL 1934 xảy ra trên INSERT với bảng có cột được tính toán PHP/PDO

Để đảm bảo tôi đã có mọi thứ chính xác, tôi thiết lập một dấu vết với SQL Server Profiler và sao chép/dán câu lệnh INSERT vào SQL Server Managment Studio. Nó chạy tốt trong SSMS, nhưng tiếp tục thất bại trong PHP.

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

Trả lời

8

Tắt vấn đề phải làm với tham số SET. Tôi đã sử dụng mã bên dưới thu được từ Here. Để xác định tùy chọn nào được đặt trong SQL Server Management Studio (nơi chèn đã hoạt động). Sau đó đặt mỗi người trong một exec trước khi chèn của tôi tuyên bố gây ra những thứ để làm việc một lần nữa. Tôi không cần phải giữ tất cả các lựa chọn, vì vậy dưới đây tôi cho thấy những cái cần thiết để làm cho nó hoạt động.

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' 

Dưới đây là các tùy chọn tôi đã kết thúc cần:

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

Cập nhật: Dường như FK hạn chế dẫn đến các lỗi sau. Lỗi trên cũng đã sửa lỗi này.

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

5

Sau @kackleyjm answer Tôi đã cố gắng kích hoạt ít tùy chọn hơn có thể.

tôi đã kết thúc với:

SET ANSI_WARNINGS ON 
SET ANSI_PADDING ON 
SET CONCAT_NULL_YIELDS_NULL ON 

này đã làm các trick cho tôi

+0

Bạn có thể cần phải viết cài đặt bằng cách sử dụng PHP. Ví dụ: $ dbPDO-> exec ("SET ANSI_WARNINGS ON"); – jjwdesign

+0

Tôi sẽ đặt cái này ở đâu? Trên một tệp cụ thể hoặc trong máy chủ? – bleykFaust

0

Tôi đã tìm thấy vấn đề này xảy ra khi bạn làm số lượng lớn chèn hoặc cập nhật sử dụng XML trong sql server. Tôi đã tìm thấy vấn đề này liên quan đến vấn đề lập chỉ mục trong một bảng. Kiểm tra

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

ở đầu thân của quy trình. Điều này sẽ giải quyết lỗi "1934".

Các vấn đề liên quan