Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHPV从SQLServer2008用户定义的表类型返回数据。5.4_Php_Sql Server 2008 - Fatal编程技术网

使用PHPV从SQLServer2008用户定义的表类型返回数据。5.4

使用PHPV从SQLServer2008用户定义的表类型返回数据。5.4,php,sql-server-2008,Php,Sql Server 2008,使用phpv。5.4,我正在尝试连接到SQL 2008数据库,并在SQL用户定义的表类型中插入数据,然后从中返回数据 SQL表数据类型定义如下: 创建类型屏幕stableType作为表格(元素代码十进制(6,2)、元素年份整数、最小值浮动、最大值浮动和或位) 我的PHP代码的精简版本是: <?php $sqlStr=''; $serverName = "Server"; //serverName\instanceName $connectionInfo = array( "Database

使用phpv。5.4,我正在尝试连接到SQL 2008数据库,并在SQL用户定义的表类型中插入数据,然后从中返回数据

SQL表数据类型定义如下:
创建类型屏幕stableType作为表格(元素代码十进制(6,2)、元素年份整数、最小值浮动、最大值浮动和或位)

我的PHP代码的精简版本是:

<?php
$sqlStr='';
$serverName = "Server"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Db");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if(!$conn ) {
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}    
$sqlStr="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) select * from @ScreensParam";
  // print $sqlStr;
$getFormData=sqlsrv_query($conn, $sqlStr);

if( $getFormData === false )
{
      if( ($errors = sqlsrv_errors() ) != null)
      {
         foreach( $errors as $error)
         {
            echo "SQLSTATE: ".$error[ 'SQLSTATE']."\n";
            echo "code: ".$error[ 'code']."\n";
            echo "message: ".$error[ 'message']."\n";
         }
      }
}

     while( $row = sqlsrv_fetch_array( $getFormData, SQLSRV_FETCH_ASSOC) ) {
       print '####'.$row['ElementCode'];

     }
?>
<?php
$sqlStr='';
$serverName = "Server"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Db");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if(!$conn ) {
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}    
$sqlStr="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) select * from @ScreensParam";
  // print $sqlStr;
$getFormData=sqlsrv_query($conn, $sqlStr);

if( $getFormData === false )
{
      if( ($errors = sqlsrv_errors() ) != null)
      {
         foreach( $errors as $error)
         {
            echo "SQLSTATE: ".$error[ 'SQLSTATE']."\n";
            echo "code: ".$error[ 'code']."\n";
            echo "message: ".$error[ 'message']."\n";
         }
      }
}

     while( $row = sqlsrv_fetch_array( $getFormData, SQLSRV_FETCH_ASSOC) ) {
       print '####'.$row['ElementCode'];

     }
?>
根据用户的请求,可以有1行或50行。我想将这些项目加载到UDTT中。在存储过程中,我创建了一个动态查询。游标在UDTT的行上迭代,并在动态查询的where子句中创建条件。然后返回数据

我遇到的问题是,当我使用UDTT时,我似乎无法让PHP返回任何结果。我只是使用上面的简化示例来查看是否有人可以返回数据

我应该补充一点,当我打印从PHP传递到SQL的“真实”字符串时,存储过程确实返回数据。我与SQL的连接很好

第三部分和最后一部分 在回答最初的问题之前,我应该说我对PHP完全是个新手。不过SQL还不错

好的,以下是我尝试过的:

不带UDTT的SQL

drop procedure testUDTT

go

create PROCEDURE [testUDTT]
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'

go
drop procedure testUDTT

go

create PROCEDURE [testUDTT]
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'

go
如果运行以下PHP代码,则返回数据:

$select="exec testUDTT";
$sqlResponse=sqlsrv_query($conn, $select);
while( $row = sqlsrv_fetch_array( $sqlResponse, SQLSRV_FETCH_ASSOC) ) {
  print '####'.$row['XmlRequest'];
  }
$select="exec testUDTT";
$sqlResponse=sqlsrv_query($conn, $select);
while( $row = sqlsrv_fetch_array( $sqlResponse, SQLSRV_FETCH_ASSOC) ) {
  print '####'.$row['XmlRequest'];
  }
如果我将$select更改为:

$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
返回数据

但是,如果我将$select更改为:

$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
没有返回数据,并且没有错误???。我怀疑SQL希望在“insert”和“exec”语句之间有一个“GO”,尽管这在我从SSMS运行时可以正常工作

我也在用另一种方式思考这个问题。如果上述存储过程有一个输入参数,如int,例如:

create PROCEDURE [testUDTT]
@InputInt int
as
SET NOCOUNT ON
if @InputInt > 0
  select XmlRequest = '###Data Returned###'
create PROCEDURE [testUDTT]
@InputInt int
as
SET NOCOUNT ON
if @InputInt > 0
  select XmlRequest = '###Data Returned###'
我的PHP代码可能类似于:

$inputInt=1;
$select="exec testUDTT @InputInt=?";
$params = array(
  array($inputInt, SQLSRV_PARAM_IN)
  );
$sqlResponse=sqlsrv_query($conn, $select, $params);
$inputInt=1;
$select="exec testUDTT @InputInt=?";
$params = array(
  array($inputInt, SQLSRV_PARAM_IN)
  );
$sqlResponse=sqlsrv_query($conn, $select, $params);
现在,如果我有一个使用UDTT的存储过程:

create PROCEDURE [testUDTT]
@ScreensParam ScreensTableType READONLY
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'
from @ScreensParam

go
create PROCEDURE [testUDTT]
@ScreensParam ScreensTableType READONLY
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'
from @ScreensParam

go
我尝试将对sql的PHP调用分为两部分(不确定这是否正确,但尝试了一下):

我收到以下错误:
SQLSTATE:42000 code:137消息:[Microsoft][SQL Server Native Client 11.0][SQL Server]必须声明标量变量“@ScreensParam”。
,因为我猜UDTT不在范围内。 我还想知道在数组中传递@ScreensParam的PHP语法应该是什么?$select会变成
exec testUDTT@ScreensParam=?
其中
“?”=“@ScreensParam”
。不知道

因此,我找到了一个创建XML而不是使用UDTT的解决方案,这是可以接受的。我花了足够多的时间让它工作。我暗自怀疑,我想做的事情目前无法用PHP完成

如果有人有/找到了解决办法,我很想知道

谢谢你的帮助。尝试很有趣

使用phpv。5.4,我正在尝试连接到SQL 2008数据库,并在SQL用户定义的表类型中插入数据,然后从中返回数据

SQL表数据类型定义如下:
创建类型屏幕stableType作为表格(元素代码十进制(6,2)、元素年份整数、最小值浮动、最大值浮动和或位)

我的PHP代码的精简版本是:

<?php
$sqlStr='';
$serverName = "Server"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Db");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if(!$conn ) {
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}    
$sqlStr="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) select * from @ScreensParam";
  // print $sqlStr;
$getFormData=sqlsrv_query($conn, $sqlStr);

if( $getFormData === false )
{
      if( ($errors = sqlsrv_errors() ) != null)
      {
         foreach( $errors as $error)
         {
            echo "SQLSTATE: ".$error[ 'SQLSTATE']."\n";
            echo "code: ".$error[ 'code']."\n";
            echo "message: ".$error[ 'message']."\n";
         }
      }
}

     while( $row = sqlsrv_fetch_array( $getFormData, SQLSRV_FETCH_ASSOC) ) {
       print '####'.$row['ElementCode'];

     }
?>
<?php
$sqlStr='';
$serverName = "Server"; //serverName\instanceName
$connectionInfo = array( "Database"=>"Db");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if(!$conn ) {
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}    
$sqlStr="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) select * from @ScreensParam";
  // print $sqlStr;
$getFormData=sqlsrv_query($conn, $sqlStr);

if( $getFormData === false )
{
      if( ($errors = sqlsrv_errors() ) != null)
      {
         foreach( $errors as $error)
         {
            echo "SQLSTATE: ".$error[ 'SQLSTATE']."\n";
            echo "code: ".$error[ 'code']."\n";
            echo "message: ".$error[ 'message']."\n";
         }
      }
}

     while( $row = sqlsrv_fetch_array( $getFormData, SQLSRV_FETCH_ASSOC) ) {
       print '####'.$row['ElementCode'];

     }
?>
根据用户的请求,可以有1行或50行。我想将这些项目加载到UDTT中。在存储过程中,我创建了一个动态查询。游标在UDTT的行上迭代,并在动态查询的where子句中创建条件。然后返回数据

我遇到的问题是,当我使用UDTT时,我似乎无法让PHP返回任何结果。我只是使用上面的简化示例来查看是否有人可以返回数据

我应该补充一点,当我打印从PHP传递到SQL的“真实”字符串时,存储过程确实返回数据。我与SQL的连接很好

第三部分和最后一部分 在回答最初的问题之前,我应该说我对PHP完全是个新手。不过SQL还不错

好的,以下是我尝试过的:

不带UDTT的SQL

drop procedure testUDTT

go

create PROCEDURE [testUDTT]
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'

go
drop procedure testUDTT

go

create PROCEDURE [testUDTT]
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'

go
如果运行以下PHP代码,则返回数据:

$select="exec testUDTT";
$sqlResponse=sqlsrv_query($conn, $select);
while( $row = sqlsrv_fetch_array( $sqlResponse, SQLSRV_FETCH_ASSOC) ) {
  print '####'.$row['XmlRequest'];
  }
$select="exec testUDTT";
$sqlResponse=sqlsrv_query($conn, $select);
while( $row = sqlsrv_fetch_array( $sqlResponse, SQLSRV_FETCH_ASSOC) ) {
  print '####'.$row['XmlRequest'];
  }
如果我将$select更改为:

$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
返回数据

但是,如果我将$select更改为:

$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] exec testUDTT";
$select="declare @ScreensParam [ScreensTableType] insert @ScreensParam values (5101.00,2011,0,100,1),(5103.00,2011,0,100,1) exec testUDTT";
没有返回数据,并且没有错误???。我怀疑SQL希望在“insert”和“exec”语句之间有一个“GO”,尽管这在我从SSMS运行时可以正常工作

我也在用另一种方式思考这个问题。如果上述存储过程有一个输入参数,如int,例如:

create PROCEDURE [testUDTT]
@InputInt int
as
SET NOCOUNT ON
if @InputInt > 0
  select XmlRequest = '###Data Returned###'
create PROCEDURE [testUDTT]
@InputInt int
as
SET NOCOUNT ON
if @InputInt > 0
  select XmlRequest = '###Data Returned###'
我的PHP代码可能类似于:

$inputInt=1;
$select="exec testUDTT @InputInt=?";
$params = array(
  array($inputInt, SQLSRV_PARAM_IN)
  );
$sqlResponse=sqlsrv_query($conn, $select, $params);
$inputInt=1;
$select="exec testUDTT @InputInt=?";
$params = array(
  array($inputInt, SQLSRV_PARAM_IN)
  );
$sqlResponse=sqlsrv_query($conn, $select, $params);
现在,如果我有一个使用UDTT的存储过程:

create PROCEDURE [testUDTT]
@ScreensParam ScreensTableType READONLY
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'
from @ScreensParam

go
create PROCEDURE [testUDTT]
@ScreensParam ScreensTableType READONLY
as
SET NOCOUNT ON
select XmlRequest = '###Data Returned###'
from @ScreensParam

go
我尝试将对sql的PHP调用分为两部分(不确定这是否正确,但尝试了一下):

我收到以下错误:
SQLSTATE:42000 code:137消息:[Microsoft][SQL Server Native Client 11.0][SQL Server]必须声明标量变量“@ScreensParam”。
,因为我猜UDTT不在范围内。 我还想知道在数组中传递@ScreensParam的PHP语法应该是什么?$select会变成
exec testUDTT@ScreensParam=?
其中
“?”=“@ScreensParam”
。不知道

因此,我找到了一个创建XML而不是使用UDTT的解决方案,这是可以接受的。我花了足够多的时间让它工作。我暗自怀疑,我想做的事情目前无法用PHP完成

如果有人有/找到了解决办法,我很想知道


谢谢你的帮助。尝试很有趣。

我一直在考虑这个问题

首先,我玩了
$sqlStr=“DECLARE@test varchar(max)SET@test='123'从表中选择*”
并且可以确认多个语句确实可以运行OK:)

第二

编辑
在其中播放更多内容,您可以将值表作为定义的表类型传递到SQL命令中,并以临时表作为参数执行SP。。。(花了