我在mssql中有一个存储过程。 SP直接执行时工作正常。当我用PHP(PHP版本5.5.13,ZF 1.12.20)调用它时,我没有得到任何结果
General SQL Server error: Check messages from the SQL Server [4004] (severity 16)
当我用临时表移除部件时,它工作正常,但这不是我的选择,因为我不拥有SP。我将SP缩短为可读。它包含4个不同SP之间的大约20个临时表,但每个临时表都会出现问题。
$this->_connection = sqlsrv_connect($serverName, $connectionInfo);
...
$this->_stmt = sqlsrv_prepare( $this->connection, 'EXECUTE spBtrgEPM9_test 104215, 37');
...
$stmt->execute($aBindableSpParams);
$aPlainResult = $stmt->fetchAll();
$aResult = array();
foreach ($aPlainResult AS $aRow) {
$sRowClass = $this->getRowClass();
if (!class_exists($sRowClass)) {
Zend_Loader::loadClass($sRowClass);
}
$aResult[] = new $sRowClass(array("data" => $aRow));
}
// Cache result
self::$_aCache[$sSpSpec][$sMd5Hash] = $aResult;
}
return self::$_aCache[$sSpSpec][$sMd5Hash];
SP:
ALTER proc [dbo].[spBtrgEPM9_test]
@arbId int
,@voId int
as begin
set nocount on
set dateformat dmy
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULL_DFLT_ON ON
SET CONCAT_NULL_YIELDS_NULL ON
declare @xml_data xml
Create table #fnDataTable
(
LastName varchar(250)
,FirstName varchar(250)
,DateOfBirth date
,Gender int
,CustomerId int
,CustomerName varchar(250)
,CustomerNumber varchar(250)
,ContributionId int
)
insert into #fnDataTable(
LastName
,FirstName
,DateOfBirth
,Gender
,CustomerId
,CustomerName
,CustomerNumber
,ContributionId
)
exec CalcDB.dbo.GetSalesData @arbId,@voId
declare @xmlValidierung varchar(max)
Set @xmlValidierung = '<?xml version="1.0"?>'+
convert(varchar(max),
(select
(SELECT top 1 y.* FROM #fnDataTable y FOR XML PATH('persondata'), TYPE)
FOR XML PATH(''), ROOT('rentenrechner'))
)
select @xml_data= CONVERT(xml, @xmlValidierung)
select @xml_data as XML_DATA
我无法更改SP。如果快速溶解,我可以添加一些线。
解决方案第1部分: 我有两个问题。我用临时表解决了这个问题。 我必须将所有字段显式声明为null。
Create table #fnDataTable
(
LastName varchar(250) null
,FirstName varchar(250) null
,DateOfBirth date null
,Gender int null
,CustomerId int null
,CustomerName varchar(250) null
,CustomerNumber varchar(250) null
,ContributionId int null
)
我仍有问题,我无法处理数据类型XML
答案 0 :(得分:0)
我也遇到了同样的问题,经过大量搜索,我发现在程序的开头添加“ SET NOCOUNT ON”并在最后添加“ SET NOCOUNT OFF”可以解决我的问题。