#sql-server #perl
#sql-сервер #perl
Вопрос:
Я пытаюсь использовать динамически созданный запрос для получения данных с ms sql server (2008) на perl.
Строка sql выглядит следующим образом:
$sql = (q/SELECT COUNT(DISTINCT COLUMNa) FROM TABLEa WHERE COLUMNb = '$var'/);
Когда я пытаюсь выполнить это, я получаю следующее сообщение об ошибке:
DBD::Sybase::st execute failed:
Server message number=245 severity=16 state=1 line=1 server=HOSTNAME
text=Conversion failed when converting the varchar value '$var' to data type tinyint.
at ./scriptname.pl line 32.
Комментарии:
1. Я вынужден отметить, что у вас есть возможность sql-инъекции там. Вы действительно должны смотреть на заполнители и привязывать значения . Кроме того, там недостаточно информации (что такое определение
TABLEa
? Как вы выполняете команду? Что в$var
?2. о, хорошо, это не веб-код, который я там пишу — это никогда не покинет мою рабочую станцию. Таблица ColumnB действительно крошечная. содержимое $var — это цифра, построенная на perl.
3. хорошо, похоже, что мой подход был неправильным. Я должен решить свою первоначальную проблему с помощью T-SQL. Моя проблема заключалась в том, что я не знал, как выполнять цикл в SQL. Думаю, это можно закрыть.
Ответ №1:
q() является буквальным. Вам нужен qq(), если вы хотите интерполировать $var.
$sql = qq/SELECT COUNT(DISTINCT COLUMNa) FROM TABLEa WHERE COLUMNb = '$var'/;
Кроме того, я согласен с комментарием по поводу SQL-инъекции. Вместо этого вы должны использовать переменную привязки.
Комментарии:
1. Спасибо! это сделало это! и да, я знаю, что это не вменяемый код, это скрипт, который я использую на своей рабочей станции.