我有一个采用一些整数参数的存储过程:
CREATE PROCEDURE [dbo].[redacted_name]
@CustomerID int ,
@ContactPersonID int,
@ChangeContactPersonId int = null,
@Name varchar(50) = NULL
-- snip
AS
BEGIN
-- snip
END
我使用以下代码调用此存储过程:
$db = $this->db();
$statement = $db->prepare("exec dbo.redacted_name @CustomerId=?,@ContactPersonId=?");
$statement->bindValue(1, 73, PDO::PARAM_INT);
$statement->bindValue(2, 42, PDO::PARAM_INT);
$statement->execute();
//snip
它会生成以下 SQL,从探查器中获取:
declare @p1 int
exec sp_prepexec @p1 output,N'@P1 TEXT,@P2 TEXT',N'exec dbo.redacted_name @customerId=@P1,@contactPersonId=@P2','73','42'
select @p1
exec sp_unprepare @p1
go
执行此 SQL,会导致 Microsoft SQL Server 11.0.5343 上出现以下错误:
Msg 206,级别 16,状态 2,过程 redacted_name,第 0
行 操作数类型冲突:文本与 int 不兼容
这是有道理的,因为TEXT != INT
考虑到我特别告诉PDO我正在传递INT
,为什么PDO会生成两个TEXT
变量?我能做些什么来解决这个问题?
我建议您调查 BindParam() 的"驱动程序选项"参数,也许它会有所帮助。
在某些情况下,这可能是问题所在。
今天我遇到了同样的问题。我得到了类似的东西:强制转换规范的字符值无效:206 [Microsoft][SQL Server 的 ODBC 驱动程序 13][SQL Server]操作数类型冲突:文本与 int 不兼容。
我在 Linux CentOS 7 上使用带有 PDO 的 PHP 7.0 和 Microsoft ODBC 以及连接字符串,如下所示:
$pdo = new PDO('odbc:driver=SQL Server Native Client 11.0;server=MyServer;database=MyDB;MARS_Connection=是"、"用户"、"通过");
要解决此问题,需要确切的存储过程参数大小写。
存储的 proc 参数@CustomerID int 是用"ID"定义的,那么你必须使用 @CustomerID = ? 而不是 @CustomerId = ?...
$statement = $db->prepare("exec dbo.redacted_name @CustomerID=?, @ContactPersonID=?");
看起来驱动程序尝试通过使用区分大小写的匹配查看 proc 参数来确定目标类型。