PERL: не могу использовать переменные в драйвере Sybase SQL для MS SQL Server

#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. Спасибо! это сделало это! и да, я знаю, что это не вменяемый код, это скрипт, который я использую на своей рабочей станции.