from the MSDN documentation,
Performs a bitwise logical OR operation between two specified integer
values as translated to binary expressions within Transact-SQL
statements.
...
The bitwise | operator performs a bitwise logical OR between the two
expressions, taking each corresponding bit for both expressions. The
bits in the result are set to 1 if either or both bits (for the
current bit being resolved) in the input expressions have a value of
1; if neither bit in the input expressions is 1, the bit in the result
is set to 0.
If the left and right expressions have different integer
data types (for example, the left expression is smallint and the right
expression is int), the argument of the smaller data type is converted
to the larger data type. In this example, the smallint expression is
converted to an int.
for example, see this fiddle,
SELECT 1 | 1, 1 | 2, 2 | 4, 3 | 5;
outputs
1 3 6 7
to explain this behavior you must consider the bit patterns of the operands,
1 | 1
00000001 = 1
| 00000001 = 1
_______________
00000001 = 1
1 | 2
00000001 = 1
| 00000010 = 2
_______________
00000011 = 3
2 | 4
00000010 = 2
| 00000100 = 4
_______________
00000110 = 6
3 | 5
00000011 = 3
| 00000101 = 5
_______________
00000111 = 7
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…