Що робить символ “@” у SQL?


76

Я переглядав питання і помітив це:

SELECT prodid, issue
FROM Sales 
WHERE custid = @custid 
AND datesold = SELECT MAX(datesold) 
             FROM Sales s 
             WHERE s.prodid = Sales.prodid
                  AND s.issue = Sales.issue
                  AND s.custid = @custid

Мені цікаво, що робить "@" перед custID? Це просто спосіб посилання на ідентифікатор custid з вибраної таблиці?


Чи є на це офіційний документ? @ може використовуватися для оголошення @variable. А також є деякі вбудовані змінні, такі як @@ ERROR, @@ trancount.
ROROROOROROR

Для MySQL google для "користувацької змінної"
huggie

Відповіді:


58

Ідентифікатор @CustID означає, що це параметр, який ви надасте значення для подальшого коду. Це найкращий спосіб захисту від ін'єкції SQL. Створіть свій запит, використовуючи параметри, а не об’єднуючи рядки та змінні. Механізм бази даних розміщує значення параметра там, де знаходиться заповнювач, і немає жодних шансів на введення SQL.


НУЛЬ? Справді? 'SELECT * FROM TABLEn WHERE ID =' & @Kibbee

9
@Mark: Чи можете ви пояснити, як це дійсна спроба введення SQL? Наскільки я бачу, це призведе до помилки, якщо буде надіслано на SqlServer.
Michael Todd

4
Причиною відсутності можливості введення SQL є те, що @CustID замінено на рядок. Коли ця база даних отримує одну з цих змінних, вона знає, що не може уникнути змінної ні для чого всередині неї.
Patrick548,

Використовуючи конкатенацію рядків для запиту sql, ви кажете, що це може призвести до проблем введення sql. Однак, якщо він використовується в api (загальнодоступному / приватному), який використовує ваша власна команда розробників, то це не повинно бути проблемою, правильно ??
Есвар,

@Kibbee, то чи треба мені використовувати @? якщо ми позбудемося @, то custid - це все ще ім'я змінної?
amjad

31

@ використовується як префікс, що позначає імена збережених процедур та параметрів функції, а також імена змінних


3

Ви можете звикнути до синтаксису MySQL: Microsoft SQL @такий самий, як і MySQL?


2

Це параметр, який вам потрібно визначити. щоб запобігти SQL Injection, ви повинні передавати всі свої змінні як параметри.


1

Ви говорите про те, як пишеться параметризований запит. '@' просто означає, що це параметр. Ви можете додати значення для цього параметра в процесі виконання

eg:
sqlcommand cmd = new sqlcommand(query,connection);
cmd.parameters.add("@custid","1");
sqldatareader dr = cmd.executequery();

0
publish data where stoloc = 'AB143' 
|
[select prtnum where stoloc = @stoloc]

Ось як це @працює.


4
У своїй відповіді дайте більше деталей, що пояснюють, як це @працює.
JSK NS

0

@ після чого цифра - це параметри в тому порядку, в якому вони перелічені у функції.


Можете навести приклад, будь ласка?
Лукас Васкес,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.