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


person Vusal Orujov    schedule 21.03.2017    source источник


Ответы (1)


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

Второй (и самый опасный) — вставлять CONVERT напрямую в параметры, открывая себя для всевозможных уродств SQL Injection.

Третьим было бы создание 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) также должны быть безопасными.

person Laughing Vergil    schedule 21.03.2017