在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谷歌,“用户定义的变量”
huggie

Answers:


58

@CustID表示它是一个参数,您将在以后的代码中提供一个值。这是防止SQL注入的最佳方法。使用参数创建查询,而不是连接字符串和变量。数据库引擎将参数值放入占位符所在的位置,并且SQL注入的机会为零。


零?真?“选择*来自TABLEn WHERE ID ='&@Kibbee

9
@Mark:您能解释一下这是一次有效的SQL注入尝试吗?据我所知,如果发送到SqlServer,它将出错。
Michael Todd

4
无法进行SQL注入的原因@CustID 是用字符串替换了。当该数据库接收到这些变量之一时,它知道不会对该变量中的任何内容进行转义。
Patrick548

您说对SQL查询使用字符串连接可能会导致sql注入问题。但是,如果在您自己的开发团队使用的api(public / private)中使用它,那么这应该不是问题吧?
Eswar

@Kibbee,所以我必须使用@吗?如果我们删除@,那么custid仍然是变量名?
amjad


3

您可能已经习惯了MySQL的语法:Microsoft SQL与MySQL的语法@相同?


2

它是您需要定义的参数。为了防止SQL注入,您应该将所有变量作为参数传递。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.