我有一个带有一些整数参数的存储过程:
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,Level 16,State 2,Procedure redacted_name,Line 0
不兼容
操作数类型冲突:文本与int
这是有道理的,因为TEXT != INT
考虑到我特意告诉PDO我正在传递INT
,为什么PDO会生成两个TEXT
变量?我能做些什么来解决它?
答案 0 :(得分:1)
我建议您调查"驱动程序选项" BindParam()的参数也许会有所帮助。
在某些情况下可能会出现问题。
答案 1 :(得分:1)
今天我遇到了同样的问题。我有类似的东西: 转换规范的字符值无效:206 [Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]操作数类型冲突:文本与int不兼容。
我在Linux CentOS 7上使用带有Microsoft ODBC的PHP 7.0和一个连接字符串,如:
$pdo = new PDO('odbc:driver=SQL Server Native Client 11.0;server=MyServer;database=MyDB;MARS_Connection=yes', 'user', 'pass');
要解决此问题,需要准确的存储过程参数。
存储过程参数@CustomerID int是用“ID”定义的,那么你必须使用@CustomerID =?而不是@CustomerId =?...
$statement = $db->prepare("exec dbo.redacted_name @CustomerID=?, @ContactPersonID=?");
看起来驱动程序试图通过使用区分大小写的匹配查看proc参数来找出目标类型。