我在 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 部分: 我有两个问题。我用临时表解决了这个问题。 我必须明确地将所有字段声明为空。
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
最佳答案
我也遇到了同样的问题,经过大量搜索,我发现在过程的开头添加“SET NOCOUNT ON”并在过程的最后添加“SET NOCOUNT OFF”解决了我的问题。
关于php - 使用临时表 [mssql] 时,存储过程没有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47436467/