2008-12-12 8 views
49

Je regardais à travers les questions et a remarqué ceci:Que fait le symbole "@" dans 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 

Je me demandais ce que le « @ » ne devant custID? Est-ce juste une façon de référencer le custID de la table sélectionnée?

Répondre

38

Le @CustID signifie qu'il est un paramètre que vous fournir une valeur pour plus tard dans votre code. C'est le meilleur moyen de se protéger contre l'injection SQL. Créez votre requête à l'aide de paramètres plutôt que de concaténer des chaînes et des variables. Le moteur de base de données place la valeur du paramètre dans la zone où se trouve l'espace réservé, et il n'y a aucune chance pour l'injection SQL.

+0

ZERO? Vraiment? 'SELECT * FROM TABLEn O WH ID =' & @Kibbee –

+8

@Mark: Pourriez-vous expliquer comment c'est une tentative d'injection SQL valide? Pour autant que je puisse voir, il serait erroné s'il est envoyé à SqlServer. –

+3

La raison pour laquelle il n'y a pas de possibilité d'injection SQL est que le '@CustID 'est remplacé par une chaîne. Lorsque cette base de données reçoit l'une de ces variables, elle sait qu'elle ne peut échapper à la variable pour rien à l'intérieur de celle-ci. – Patrick548

24

@ est utilisé comme préfixe indiquant la procédure stockée et les paramètres de fonction, ainsi que les noms de variables

1

C'est un paramètre que vous devez définir. Pour empêcher l'injection SQL, vous devez passer toutes vos variables en paramètres.

1

Vous pouvez être utilisé pour la syntaxe de MySQL: Microsoft SQL @ est le même que le ? de MySQL

2

Alors placeriez-vous ce que @ la valeur de custID se trouve dans cette requête de sélection ou avant de faire la requête?

Quelque chose comme ça?

SET @custID = '1'; 
+0

Si le SQL est une procédure stockée, vous devez le définir avant la requête. Les détails pour cela sont spécifiques à la langue \ plateforme. S'il s'agit d'une requête pure, vous devez définir la variable, puis la définir: DECLARE @custID int SET @custID = 1; –

1

Ce dont vous parlez, c'est la façon dont une requête paramétrée est écrite. '@' signifie simplement que c'est un paramètre. Vous pouvez ajouter la valeur de ce paramètre au cours du processus d'exécution

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] 

Voici comment les œuvres @.

+3

Dans votre réponse, donnez plus de détails expliquant comment '@' fonctionne. –

0

@ suivi d'un nombre correspond aux paramètres dans l'ordre dans lequel ils sont répertoriés dans une fonction.