【问题标题】:PHP-SQLSRV Stored Procedure with input variable of type `bit`PHP-SQLSRV 存储过程,输入变量类型为 `bit`
【发布时间】:2011-10-24 17:30:23
【问题描述】:

我必须移植一个基于 LAMP 的项目,该项目使用 PHP-MSSQL 连接到 SQL Server 数据库。它必须移植到使用 PHP-SQLSRV 连接到 SQL Server 数据库的基于 WAMP 的机器上。

我可以通过执行存储过程来获取/设置数据。似乎大多数类型的输入变量都很容易上手。但我无法让bit 类型的输入参数工作。

我尝试在 PHP 中使用“真实”或“虚假”的各种值,但没有一个能让我摆脱错误:

  • “真实”的东西不起作用:

    • 1
    • "1"
    • true
    • "True"
  • “虚假”的东西不起作用:

    • 0
    • "0"
    • false
    • "False"

我尝试使用各种方法将项目添加到$params 数组,包括省略可选参数以及定义 PHP 和 SQL 数据类型。没有任何效果。

我来自 SQL Server(转换为 JSON 对象)的错误消息是:

[{
  "0":"42000",
  "SQLSTATE":"42000",
  "1":8114,
  "code":8114,
  "2":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit.",
  "message":"[Microsoft][SQL Server Native Client 10.0][SQL Server]Error converting data type varchar to bit."
}]

为了生成此错误消息,我传递了一个值 01,它们都不是 varchar 甚至是字符串。

为了保持最大的兼容性,我不想将存储过程更改为在 SQL Server 上转换/转换数据。我希望通过 PHP 保持存储过程不变。


PHP 代码:

<?php
  $link = sqlsrv_connect($host,Array("Database"=>$database,"UID"=>$username,"PWD"=>$password));
  $sql = " { call StoredProcedureName ( @input_param_of_bit_type=? ) } ";
  $param1 = 1;
  $params = Array(
    Array(&$param1, SQLSRV_PARAM_IN)
  );
  $stmt = sqlsrv_prepare($link,$sql,$params);
  if ($stmt===false) {
    // handle error
    print_r(sqlsrv_errors,true);
  } else {
    if (sqlsrv_execute($stmt)===false) {
      // handle error.  This is where the error happens
      print_r(sqlsrv_errors,true);
    } else {
      // success! It never gets here, though.
    }
  }
?>

【问题讨论】:

  • 可能必须修改查询以包含 CAST(0 AS BIT) 以强制位数据类型。
  • @Marc B:实际的 SQL 查询位于 SQL Server 上的存储过程中。我想保持存储过程不变。
  • 请发布调用 PHP,问题可能出在此处,特别是如果您正在参数化您的 proc 调用。

标签: php sql-server tsql stored-procedures


【解决方案1】:

重新排序命名参数的顺序使这项工作有效。我必须使用 SQL Server Management Studio 软件和 Profile Tracing 来了解从 php-sqlsrv 执行存储过程与直接从 SQL Server Management Studio 中执行存储过程有何不同。

按照 SQL Server Management Studio 使用的确切顺序输入参数后,一切正常。

【讨论】:

    【解决方案2】:

    上面的 T-SQL 似乎使用了默认的字符串类型,它以一种不会转换的方式发送到服务器。最好的解决方法是在参数中指定 PHPTYPE 和 SQLTYPE:

    $params = Array( Array(&$param1, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_INT, SQLSRV_SQLTYPE_BIT) );

    请尝试更改并查看您的查询是否正确执行。

    谢谢!

    【讨论】:

    • 试过这个,但没有任何区别。我可以使用命名参数执行其他存储过程。只有具有位类型的输入参数的存储过程会导致错误。
    • 我已经尝试过了,但仍然出现错误。你能确认我没有在 php-sqlsrv 中发现错误吗?也就是说,你能执行一个接受bit类型输入参数的存储过程吗?
    猜你喜欢
    • 2020-09-19
    • 1970-01-01
    • 2016-01-21
    • 2022-11-03
    • 1970-01-01
    • 2021-03-08
    • 2012-01-11
    • 2011-07-02
    • 2013-10-15
    相关资源
    最近更新 更多