Was macht das @ -Symbol in SQL?

75

Ich habe die Fragen durchgesehen und Folgendes festgestellt:

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

Ich habe mich gefragt, was das "@" vor custID macht. Ist es nur eine Möglichkeit, die custID aus der ausgewählten Tabelle zu referenzieren?

Levi
quelle
Gibt es ein offizielles Dokument dazu? @ kann verwendet werden, um @variable zu deklarieren. Außerdem gibt es einige integrierte Variablen wie @@ ERROR, @@ trancount.
ROROROOROROR
Für MySQL google für "benutzerdefinierte Variable"
Huggie

Antworten:

58

Die @CustID bedeutet, dass es sich um einen Parameter handelt, für den Sie später in Ihrem Code einen Wert angeben. Dies ist der beste Schutz vor SQL-Injection. Erstellen Sie Ihre Abfrage mithilfe von Parametern, anstatt Zeichenfolgen und Variablen zu verketten. Das Datenbankmodul setzt den Parameterwert dort, wo sich der Platzhalter befindet, und es besteht keine Chance für eine SQL-Injection.

Kibbee
quelle
NULL? "Ja wirklich?" 'SELECT * FROM TABLEn WHERE ID =' & @Kibbee
9
@ Mark: Können Sie erklären, wie das ein gültiger SQL-Injection-Versuch ist? Soweit ich sehen kann, würde es einen Fehler geben, wenn es an SqlServer gesendet wird.
Michael Todd
4
Der Grund dafür, dass keine Möglichkeit der SQL-Injection besteht, besteht darin, dass das @CustID durch eine Zeichenfolge ersetzt wird. Wenn diese Datenbank eine dieser Variablen empfängt, weiß sie, dass sie der Variable für nichts in ihr entkommen kann.
Patrick548
Wenn Sie die Verkettung von Zeichenfolgen für eine SQL-Abfrage verwenden, kann dies zu Problemen bei der SQL-Injektion führen. Wenn es jedoch in der API (öffentlich / privat) verwendet wird, die von Ihrem eigenen Entwicklerteam verwendet wird, sollte das kein Problem sein, oder?
Eswar
@Kibbee, muss ich also @ verwenden? Wenn wir @ loswerden, ist custid immer noch ein Variablenname?
Amjad
30

@ wird als Präfix verwendet, das Namen gespeicherter Prozeduren und Funktionsparameter sowie Variablennamen angibt

Steven A. Lowe
quelle
3

Möglicherweise sind Sie an die MySQL-Syntax gewöhnt: Microsoft SQL @ist mit MySQL identisch?

ine
quelle
2

Es ist ein Parameter, den Sie definieren müssen. Um SQL Injection zu verhindern, sollten Sie alle Ihre Variablen als Parameter übergeben.

Bendewey
quelle
1

Sie sprechen über die Art und Weise, wie eine parametrisierte Abfrage geschrieben wird. '@' bedeutet nur, dass es sich um einen Parameter handelt. Sie können den Wert für diesen Parameter während des Ausführungsprozesses hinzufügen

eg:
sqlcommand cmd = new sqlcommand(query,connection);
cmd.parameters.add("@custid","1");
sqldatareader dr = cmd.executequery();
Samiksha
quelle
0
publish data where stoloc = 'AB143' 
|
[select prtnum where stoloc = @stoloc]

So funktioniert das @.

marc
quelle
4
Geben Sie in Ihrer Antwort weitere Details an, um zu erklären, wie das @funktioniert.
JSK NS
0

@ gefolgt von einer Zahl sind die Parameter in der Reihenfolge, in der sie in einer Funktion aufgelistet sind.

ZeroPhase
quelle
Kannst du bitte ein Beispiel geben?
Lucas Vazquez