2009-05-31 17 views
4

Was macht dieses SQL IF mit dem Ampersand? DieseWas macht dieses SQL IF mit dem Ampersand?

IF ((@TablesToDeleteFrom & 1) <> 0 AND 
      (@TablesToDeleteFrom & 2) <> 0 AND 
      (@TablesToDeleteFrom & 4) <> 0 AND 
      (@TablesToDeleteFrom & 8) <> 0 AND 
      (EXISTS (SELECT UserId FROM dbo.aspnet_Users WHERE @UserId = UserId))) 
     BEGIN 
    ... 

ist aus der aspnet mebership DB innerhalb des aspnet_Users_DeleteUser SP. Das @TablesToDeleteFrom wird als int deklariert und standardmäßig auf 0 gesetzt. Ich habe die Verwendung des & nicht schon vorher gesehen.

+0

möglich Duplikat [& Operator in einer SQL Server-WHERE-Klausel] (http://stackoverflow.com/questions/ 670230/Operator-in-einem-SQL-Server-Where-Klausel) – outis

Antwort

7

Dies ist ein bitwise Operator. Im Grunde werden zu löschende Tabellen mehrere Tabellen in einem einzelnen, integerbasierten Feld speichern, indem eine bitweise Kombination von Werten für Tabellen erstellt wird. Hier ist ein Beispiel.

1 - TableA 
2 - TableB 
4 - TableC 
8 - TableD 

TabelleA & TabelleB = 1 | 2 = 3. (Sie verwenden den Operator OR, um das Ergebnis zu erhalten, und den Operator AND, um nach einem Ergebnis zu suchen). Also wird der Wert von 3 im Feld gespeichert. Sie können dann den kaufmännischen Und-Operator verwenden, um festzustellen, ob der Wert festgelegt wurde. 1 & 3 == 1, so würde TableA gelöscht werden. 4 & 3 = 0 also TableC würde nicht gelöscht werden.

+0

Aaargh! Kann nicht glauben, dass ich das nicht sehe! Danke Bob. – TheUXGuy

+0

Kein Problem, es ist offensichtlich, wenn Sie es oft verwenden, aber es ist nicht so üblich. – Bob

5

Wie @Bob sagt, & ist bitweise und; und so, nebenbei bemerkt, eine kompaktere Äquivalent

IF ((@TablesToDeleteFrom & 1) <> 0 AND 
      (@TablesToDeleteFrom & 2) <> 0 AND 
      (@TablesToDeleteFrom & 4) <> 0 AND 
      (@TablesToDeleteFrom & 8) <> 0 AND 

ist

IF ((@TablesToDeleteFrom & 15) = 15) AND 
+0

Ausgezeichnet - danke für den Tipp. – TheUXGuy