php - 使用临时表 [mssql] 时,存储过程没有结果

标签 php sql-server stored-procedures

我在 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/

相关文章:

php - 如何从邮件服务器获得错误响应?

php - DateTime/DateInterval 每次刷新增加 25 小时会产生完全不同的结果

php - AJAX,GET ok,POST 不行

sql - 存储在数据库中的用户权限

sql-server - 从 Service Broker 外部激活非 .NET 应用程序

sql-server - SSMS 搜索数据库名称?

javascript - 显示临时 header 和待处理请求

django - 必须声明 PLS-00201 标识符 'PACKAGENAME.PROCEDURENAME'

mysql - 操作 '=' 的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合

sql-server - 使用一个接受可变数量参数的存储过程是一种好习惯吗