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 2000 调用 MySQL 存储过程?