[SQL 服务器]不允许从数据类型 nvarchar(max) 到 varbinary(max) 的隐式转换。使用 CONVERT 函数 运行 这个查询

[SQL Server]Implicit conversion from data type nvarchar(max) to varbinary(max) is not allowed. Use the CONVERT function to run this query

这是我的代码

DB::statement(DB::raw('EXECUTE dbo.SP_WS_CUST_MAIN ?,?,?,?,?,?,?'),
    [ $USER_ID, $CUST_PYMT_MTHD, $CUST_CMMNT, $CUST_NAME, $ANDROID_LOCATION,
      DB::raw("CONVERT(VARBINARY(MAX), $value)") , $WEEKDAY]
);

如何将 nvarchar(max) 转换为 varbinary(max)?

我能想到三种可能。最简单的方法是创建一个 shell 存储过程(比如 dbo.SP_WS_CUST_MAIN_VC),它只接受参数,包括 $value 作为 varchar(max),然后转换 $valuevarbinary(max) 并调用目标存储过程。这确保了参数替换的正确引用。

第二种(也是最危险的)是将 CONVERT 直接嵌入到参数中,让自己暴露在各种 SQL 注入丑陋的环境中。

第三种方法是创建一个接受 varchar(max) 和 returns 和 varbinary(max) 的 UDF,并将其嵌入到基础 EXECUTE 调用中,例如:

DB::statement(DB::raw('EXECUTE dbo.SP_WS_CUST_MAIN ?,?,?,?,?,dbo.castAsVarbinary(?),?'),
    [ $USER_ID, $CUST_PYMT_MTHD, $CUST_CMMNT, $CUST_NAME, $ANDROID_LOCATION,
      DB::raw("CONVERT(VARBINARY(MAX), $value)") , $WEEKDAY]
);

这些都可以,但 (1) 和 (3) 也应该是安全的。