2008-12-12 32 views
49

我是通过浏览的问题,并注意到了这一点:“@”符号在SQL中做什么?

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的一种方式吗?

回答

38

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

+0

ZERO?真? 'SELECT * FROM TABLEn WHERE ID ='&@Kibbee – 2008-12-16 16:07:18

+8

@Mark:你能解释一下这是一个有效的SQL注入尝试吗?据我所知,如果发送到SqlServer会发生错误。 – 2009-07-27 18:47:04

+3

SQL注入不可能的原因是`@CustID`被替换为一个字符串。当数据库收到这些变量中的一个时,它知道不会为变量内部的任何内容转义。 – Patrick548 2012-11-29 19:01:35

24

@作为前缀表示存储过程和函数的参数名称,也变量名

1

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

1

您可以使用MySQL的语法:微软SQL @是一样的MySQL的?

2

所以,你会设置什么@ CUSTID的值是该选择查询内部或之前你做的查询?

这样的事情?

SET @custID = '1'; 
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] 

这是怎么@作品为参数添加值。

0

@后跟一个数字就是它们在函数中列出的顺序中的参数。