Member 11297177 Ответов: 3

'Функция concat' не является известным имя встроенной функции.


string str = "select * from TblPatientReg where concat('PID','PName','RoomNo') like '%" + valueToSearch + "%'";


я пишу этот запрос для поиска пациента по идентификатору,имени,номеру комнаты, но сталкиваюсь с проблемой, подобной вышеупомянутой теме.

пожалуйста, проводите меня .

Что я уже пробовал:

<pre>string str = "select * from TblPatientReg where concat('PID','PName','RoomNo') like '%" + valueToSearch + "%'";


я пишу этот запрос для поиска пациента по идентификатору,имени,номеру комнаты, но сталкиваюсь с проблемой, подобной вышеупомянутой теме.

можете вы, пожалуйста, руководство меня

3 Ответов

Рейтинг:
20

F-ES Sitecore

Я погуглил "concat sql 2008", и это лучший результат

Как использовать функцию CONCAT в SQL Server 2008 R2? - переполнение стека[^]

Всегда лучше погуглить свою проблему, прежде чем задавать вопрос.


Member 11297177

большое вам спасибо , что вы судили ссылку, которая отлично работала. смотрите ниже, как сработал запрос.

строка str = "select * from TblPatientReg where (PID+','+PName+"+RoomNo) like '%" +txtsearch.Текст + "%'";

Maciej Los

5ed!

Рейтинг:
2

Member 11297177

Пожалуйста, найдите ниже запрос работает нормально для моей проблемы для sql server 2008r2

string str = "select * from TblPatientReg where (PID+','+PName+''+RoomNo) like '%" +txtsearch.Text + "%'";


Richard Deeming

Ваш код по-прежнему уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Рейтинг:
14

OriginalGriff

Первое, что нужно отметить, просто: не делайте этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Второе: CONCAT прекрасно работает в моей системе, даже в том виде, который вы показываете:
SELECT * FROM MYTABLE WHERE concat('PID','PName','RoomNo') LIKE '%a%'

Так... вы, вероятно , не используете SQL Server, или MySql, или ... а еще нужно погуглить для КОНКАТА и название вашего движка БД...

Во-вторых, этот код не будет делать то, что вы хотите, даже на SQL Server, или MySQL, или ... он либо вернет все строки, либо ни одной. Этот бит:
concat('PID','PName','RoomNo') like
это означает, что вы всегда будете сравнивать фиксированную строку "PIDPNameRoomNo" с вашей поисковой строкой вместо фактических данных столбца. Вероятно, вы хотите что-то вроде
concat(PID, PName, RoomNo) like
, но вам может понадобиться некоторое литье там в зависимости от вашего дизайна БД.


Member 11297177

я использую sql server 2008, но функция concat не распознается

OriginalGriff

CONCAT был добавлен в SQL Server 2012, поэтому вы не можете использовать его в более ранних версиях.
Вместо этого вам придется использовать string + string + string, вероятно, с некоторыми операциями приведения, чтобы преобразовать ваши столбцы в строки.

Member 11297177

ваша правильная функция concat не поддерживает поддержку для 2008 R2, поэтому я использовал приведенный ниже запрос, который работал нормально .

строка str = "select * from TblPatientReg where (PID+','+PName+"+RoomNo) like '%" +txtsearch.Текст + "%'";

OriginalGriff

Прочтите, что я сказал Для начала: если ваш код оставляет один экземпляр SQL-инъекции таким образом, в какой-то момент ваш лучший друг собирается удалить вашу БД только для того, чтобы увидеть выражение вашего лица. Это не шутка.

Member 11297177

конечно , понял .

спасибо