我试图从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')) = 0
和SET ARITHABORT ON;
。这会解决1934错误