ADODB and SQL SERVER functions


ADODB and SQL SERVER functions

我有一个web服务,它使用ADODBforPHP连接到我的MSSQL数据库。然后,我创建了一个简单的函数来返回一个字符串,只是为了测试,但是,我将用另一个逻辑来实现。

这是我的SQL SERVER函数:

USE [myDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [myDB].[VerifyUser]
(
    @user varchar(50),
    @pass varchar(50)
)
RETURNS varchar(32)
AS
BEGIN
    DECLARE @token varchar(32);
    SET @token = 'Works!';
    RETURN @token;
END

这是我的web服务方法:

function wseAutenticacao($usuario, $senha) {
    require_once('include/adodb5/adodb.inc.php');
    $db = &ADONewConnection('mssqlnative');
    $db->Connect(<host>, <user>, <pass>, <db_name>);
    $stmt = $db->Prepare('VerifyUser');
    $db->InParameter($stmt, $usuario, 'user');
    $db->InParameter($stmt, $senha, 'pass');
    $db->OutParameter($stmt, $token, 'token');
    $result = $db->Execute($stmt);
    return array('result' => $result);
}

我没有得到sql函数返回的字符串"Works!"。返回的是一个带有false值的布尔值,就像我做错了什么一样,但是,我遵循了ADODB文档的示例,现在,我不知道该怎么办。我被卡住了!

如果有人愿意分享你的知识,我会很棒的!

谢谢!

@token局部变量仅在函数本身中可见。标量函数的结果需要分配给执行脚本中的输出参数。您可以尝试的一种方法是使用参数化SELECT语句将函数返回值分配给输出参数:

$stmt = $db->Prepare('SELECT @token = VerifyUser(@user, @pass);');

我知道这个线程很旧,但我正在寻找类似的解决方案。"mssqlnative"的当前实现似乎根本不支持参数。也就是说,基类ADOConnection实现了应在子类中重写的模拟方法Parameter。ADODB_mssqlnative没有此方法的重写,因此,您的参数将消失在空白中。接下来,_query()的当前实现期望输入参数为数组。所以,你可以把你的代码改成这样,让它在上工作

$db = &ADONewConnection('mssqlnative');
$db->Connect(<host>, <user>, <pass>, <db_name>);
$stmt = 'VerifyUser';
$params = array($usuario, $senha, $token);
$result = $db->Execute($stmt, $params);
return array('result' => $result);

另外,请注意params数组不是关联的。sqlsrv_query的当前实现不允许使用命名参数。