如何更正存储过程错误#1934?(SQL Server / PHP)


How do I correct a Stored Procedure Error #1934? (SQL Server / PHP)

我试图从PHP (PHP- pdo连接)执行存储过程。存储过程在SQL Server Management Studio (SQL控制台)中完美地测试/运行;没有错误报告。当我尝试从PHP运行它时,它不能正确执行。我设法向存储过程添加了TRY/CATCH,并从PHP执行器收到了以下错误信息。有人理解这个错误吗?

注意,我正在对临时表#MY_TABLE中的数据进行动态透视。我还动态地建立一个合并查询字符串后执行。这是一个有点复杂的存储过程。

EXEC MY_STORED_PROCEDURE '24566572-290E-4FE5-9AF6-8EEE4804F091'
Array
(
    [0] => EXEC MY_STORED_PROCEDURE '24566572-290E-4FE5-9AF6-8EEE4804F091'
    [1] => stdClass Object
        (
            [queryString] => EXEC MY_STORED_PROCEDURE '24566572-290E-4FE5-9AF6-8EEE4804F091'
        )
    [2] => stdClass Object
        (
            [ErrorNumber] => 1934
            [ErrorSeverity] => 16
            [ErrorState] => 1
            [ErrorProcedure] => MY_STORED_PROCEDURE 
            [ErrorLine] => 139
            [ErrorMessage] => SELECT failed because the following SET options have incorrect settings: 'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/
        )
)

我注意到类似的问题,如:SQL Server错误1934发生在INSERT到表与计算列PHP/PDO

但是,下面是我的存储过程的顶部。我不知道为什么PHP PDO不会在存储过程中使用SET语句。

USE [MYDBTEST]
GO
/****** Object:  StoredProcedure [dbo].[MY_STORED_PROCEDURE]    Script Date: 06/25/2014 14:29:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_WARNINGS ON
GO
SET ANSI_PADDING ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO 

好的,我用SET语句解决了这个问题。我正在使用MS SQL Server管理工作室(SSMS)来"修改"存储过程。当我这样做时,我注意到页面顶部有两个SET语句。不幸的是,这些SET语句不在ALTER PROCEDURE语句中。因此,当我尝试在页面顶部添加额外的SET语句时,它们不是ALTER PROCEDURE语句的一部分,因此不会被保存(更改)。由于页面没有以任何方式重新加载/重新修改,因此它们保持在顶部。因此,解决方案是确保将任何更改放在ALTER PROCEDURE中。

USE [MYDBTEST]
GO
/****** Object:  StoredProcedure [dbo].[MY_STORED_PROCEDURE] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:  Jeff Walters
-- Create date: 6/20/2014
-- Description: 
-- 
-- =============================================
ALTER PROCEDURE [dbo].[MY_STORED_PROCEDURE]
                (
                @id CHAR(36) = NULL
                )
AS

BEGIN
    SET ANSI_NULLS ON;
    SET QUOTED_IDENTIFIER ON;
    SET ANSI_WARNINGS ON;
    SET ANSI_PADDING ON;
    SET CONCAT_NULL_YIELDS_NULL ON;

这对我有用:

SET ANSI_WARNINGS ON;
SET ANSI_PADDING ON;
SET CONCAT_NULL_YIELDS_NULL ON;

检查程序体顶部的IF (SELECT SESSIONPROPERTY('ARITHABORT')) = 0SET ARITHABORT ON;。这会解决1934错误