将计算列添加到SQL Server 2005中的表后,我在INSERT
上收到以下消息,仅通过PHP(使用PDO),它在SQL Server Managment Studio中正常工作。
为了确保我的一切正确,我使用SQL Server Profiler设置了跟踪,并将INSERT语句复制/粘贴到SQL Server Managment Studio中。它在SSMS中运行得很好,但在PHP中仍然失败。
添加联系人时出错:SQLSTATE [HY000]:常规错误:1934常规SQL 服务器错误:检查来自SQL Server的消息[1934](严重级16) [(空)]
答案 0 :(得分: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]:常规错误:8624常规SQL Server错误:检查 来自SQL Server [8624]的消息(严重级16)[(null)]
答案 1 :(得分:6)
在@kackleyjm回答后,我尝试激活可能的选项较少。
我最终得到了:
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET CONCAT_NULL_YIELDS_NULL ON
这对我来说很有把戏
答案 2 :(得分:0)
我发现在sql server
中使用XML进行批量插入或更新时会出现此问题。我发现这个问题与表中的索引问题有关。检查
`IF (SELECT SESSIONPROPERTY('ARITHABORT')) = 0 and SET ARITHABORT ON;`
位于程序正文的顶部。这将解决"1934"
错误。