【问题标题】:odbc_prepare for procedure with datetime input parametersodbc_prepare 用于带有日期时间输入参数的过程
【发布时间】:2014-08-29 19:56:38
【问题描述】:

odbc_prepare 语句有点新,在尝试执行需要日期时间输入参数的存储过程时遇到问题。

如果我要使用 odbc 执行而不使用如下所示的准备好的语句,我没有问题...

$dblink = db_connect();
$query = "EXEC dbo.[ProcedureName] '" . $dateinput . "'";
odbc_exec($dblink, $query);

使用 odbc_prepare 时出现错误(仅适用于具有 DateTime 输入参数的过程)。下面的例子...

function execute_db($dblink, $query, $params){
   $n = sizeof($params);
   for($i=0; $i<$n; $i++){
        if($i != 0){
            $query = $query . ', ?';
        }
        else{
            $query  = $query . ' ?';
        }
    }

    $statement = odbc_prepare($dblink, $query);
    odbc_execute($statement, $params);

    return $statement;
}

$dblink = db_connect();
$query = "EXEC dbo.[ProcedureName]";
$params = array($dateinput);

$result = execute_db($dblink, $query, $params);

这会返回以下错误:

警告:odbc_execute():SQL 错误:[Microsoft][ODBC SQL Server 驱动程序]强制转换规范的字符值无效,SQL 状态 22005 在 SQLExecute 中

我传入的日期字符串是 'mm/dd/yyyy' 格式,并且在不使用 prepare 的情况下可以正常工作。除了更改存储过程的输入类型之外,还有其他解决方法吗?

【问题讨论】:

    标签: php sql-server datetime stored-procedures odbc


    【解决方案1】:

    使用正确的 ODBC 语法调用过程并使用正确的日期时间语法,这可能会让您走得更远。调用语法是 {call procname(arguments)}。日期时间语法是 {ts ''} - 请参阅 Date, Time, and Timestamp Escape SequencesODBC Datetime Format

    【讨论】:

    • 这里很奇怪,我确实在发布之前尝试使用 CALL,但我会收到错误:无效的参数号,SQL 状态 S1093... 但是我确实将 php 中的 DateTime 格式切换为date(Ymd H:i:su) 使用我原来的 execute_db 函数,它可以工作。将此标记为已回答,如果您碰巧有任何有关 CALL 错误的信息会有所帮助!
    • 您需要使用 '{call procname(?)}' 并将您的日期绑定到参数 1。
    • 是的,这就是我尝试并得到 S1093 错误:CALL Procedure(?) with array('yyyy-mm-dd hh:mm:ss.u'),所以我切换回 EXEC . EXEC 现在可以工作,但我知道这不是正确的语法。试图找出原因,但至少现在我猜它正在工作。 @bohica
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多