[SQL Server] Неявное преобразование из типа данных nvarchar(max) в varbinary(max) не допускается. Используйте функцию CONVERT, чтобы выполнить этот запрос

Это мой код

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)?

1 ответ

Решение

Я могу думать о трех возможностях. Простейшим было бы создать хранимую процедуру оболочки (скажем, dbo.SP_WS_CUST_MAIN_VC) который просто принимает параметры, в том числе $value как VARCHAR (Макс), то делает преобразование $value к varbinary(max) и вызывает целевую хранимую процедуру. Это обеспечивает правильное цитирование с заменой параметра.

Второе (и наиболее опасное) - это вставить CONVERT непосредственно в параметры, открывая для себя все виды безобразия SQL-инъекций.

Третий - создать UDF, который принимает varchar(max) и возвращает varbinary(max)и вставьте это в базу 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) также должны быть безопасными.

Другие вопросы по тегам