PHP中的SQL Server存储过程调用 - 无法获取它返回到php中的xml数据

Posted

技术标签:

【中文标题】PHP中的SQL Server存储过程调用 - 无法获取它返回到php中的xml数据【英文标题】:SQL Server Stored Procedure Call in PHP - Can't get xml data it returns back into php 【发布时间】:2009-09-11 14:12:02 【问题描述】:

试图从 php 调用 SQL SERVER 存储过程。认为我已经让它工作了,但我无法将它返回的数据返回到 php.ini 中。我正在复制我的 php 代码以及下面的示例 SQL SERVER 代码。

相信我的问题是如何从 reportData 中获取数据? mssql_execute() 只返回布尔值 true。在我看来,该过程将 reportData 中的数据存储为 xml。但是,当我尝试使用 mssql_bind() 通过引用将数据导入 reportData 时,我收到有关从 xml 转换为 varchar 的警告。

我的 php 代码

mssql_query("exec ZUSER.pSessionCreate @LoginName = 'admin', @Password = 'xxxx'", $Conn);
$proc = mssql_init("ZUSER.pAppraisal", $Conn);
$reportData="";
$portfolios=3014;
$date="08/19/2009";
mssql_bind($proc, "@reportData", &$reportData, SQLVARCHAR , TRUE, FALSE, 4000);
mssql_bind($proc, "@portfolios", $portfolios, SQLVARCHAR);
mssql_bind($proc, "@date", $date, SQLINT4 );
$result = mssql_execute($proc);

这将引发这些错误。

Warning: mssql_execute() [function.mssql-execute]: message: Implicit conversion from data type xml to varchar is not allowed. Use the CONVERT function to run this query. 
Warning: mssql_execute() [function.mssql-execute]: stored procedure execution failed 

如果我将 mssql_bind 的类型从 SQLVARCHAR 更改为 SQLTEXT,则会收到此错误。

Warning: mssql_execute() [function.mssql-execute]: message: Invalid parameter 1 ('@reportData'): Data type 0x23 is a deprecated large object, or LOB, but is marked as output parameter. Deprecated types are not supported as output parameters. Use current large object types instead. 

另外..如果我不使用 mssql_bind 这样它就不会尝试将数据返回给 reportData,它运行时没有错误并返回 true,但我不知道如何获取我需要的数据。

mssql_bind($proc, "@reportData", $reportData, SQLVARCHAR);

在这种情况下,如果我在调用 mssql_execute 后尝试运行此查询,则会收到此错误。

$result=mssql_query("select field1, field2, field3 from ZUSER.pAppraisal(@reportData)", $Conn);

Warning: mssql_query() [function.mssql-query]: message: Must declare the scalar variable "@reportData"

示例 SQL Server 代码:

declare @SessionGuid uniqueidentifier
declare @portfolios nvarchar(max)
declare @date datetime
set @portfolios='3014'
set @date='08/19/2009'
exec ZUSER.pSessionCreate @LoginName = 'admin', @Password = 'xxxx'
declare @reportData xml
exec ZUSER.pAppraisal
    @reportData=@reportData out
    ,@portfolios = @portfolios
    ,@date = @date

select field1, field2, field3 from ZUSER.fAppraisal(@reportData)

【问题讨论】:

【参考方案1】:

您需要SQL Server Native client for PHP 来利用 XML 等新数据类型。

【讨论】:

我昨天确实安装了那个。没有它,我什至无法让 mssql_connect() 工作。我将在 mssql_bind() 中为 XML 指定什么数据类型?另外,我可能没有正确安装?查看 phpinfo 我确实看到 sqlsrv qlsrv.LogSeverity 0 0 sqlsrv.LogSubsystems 0 0 sqlsrv.WarningsReturnAsErrors On On 的部分应该意味着它已启用,对吗?这是我添加到 php.ini 的 dll,谢谢 SQLSRV_SQLTYPE_XML。见msdn.microsoft.com/en-us/library/cc296183(SQL.90).aspx 当我使用它时获取不受支持的类型。 mssql_bind($proc, "@reportData", &$reportData, SQLSRV_SQLTYPE_XML , TRUE, FALSE);警告:mssql_bind() [function.mssql-bind]:不支持的类型 对不起,我很糟糕。根据msdn.microsoft.com/en-us/library/cc296193(SQL.90).aspx,XML 被映射到一个流,因此您应该使用SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR)),如msdn.microsoft.com/en-us/library/cc296163(SQL.90).aspx 的示例中所示。所有示例都是用于获取结果,而不是用于绑定输出参数。 谢谢。为此需要使用您链接到的 sqlsrv_ 函数。如果我将这些类型与 mssql_bind() 一起使用,它会给出不受支持的类型,因此看起来它需要使用那些 sqlsrv_ 函数。知道如何使用这些函数调用存储过程吗?我没有看到 _init()、_bind() 和 _execute() 被列为 sqlsrv 的函数。 msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx 谢谢。

以上是关于PHP中的SQL Server存储过程调用 - 无法获取它返回到php中的xml数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server基础之存储过程

Qt调用Server SQL中的存储过程

如何从 SQL Server 2000 调用 MySQL 存储过程?

在SQL Server2005中,下面调用存储过程的语句错误的是:

存储过程具体过程以及sql数据库调用和程序代码调用

Sql Server中的存储过程