Computed columns in SQL server are very handy when we’ve got a formula that we can rely on and some CPU cycles to spare. There’s heaps of articles online about what these are, so we’d not repeat it here. Let us rather look at one peculiar case…
What if I’ve got two bit columns?
A very plausible scenario indeed. Let’s create a table like so:
CREATE TABLE Test ( Id INT PRIMARY KEY, Check1 BIT NOT NULL, Check2 BIT NOT NULL, CheckAll AS (Check1 = 1 OR Check2 = 1) -- Incorrect syntax near '='. )
that didn’t seem to work and the error message is a bit unhelpful: we know it’s wrong but why?
Reading the documentation once again
Is an expression that defines the value of a computed column. A computed column is a virtual column that is not physically stored in the table but is computed from an expression that uses other columns in the same table. For example, a computed column could have the definition: cost AS price * qty. The expression can be a noncomputed column name, constant, function, variable , and any combination of these connected by one or more operators. The expression cannot be a subquery or include an alias data type.
Okay, this kinda hints at the fact we need to return a value. So a simple search condition does not cut it. Let us try one more time:
CREATE TABLE Test ( Id INT PRIMARY KEY, Check1 BIT NOT NULL, Check2 BIT NOT NULL, CheckAll AS (CASE WHEN Check1 = 1 OR Check2 = 1 THEN 1 ELSE 0 END) -- this time is better! we can roll with it )
Take it up another notch
The above example works but looks a bit too verbose and explicit. Is there a better way? If we deal with bit columns, we might be in luck and opt for t-sql bitwise operators:
CREATE TABLE Test ( Id INT PRIMARY KEY, Check1 BIT NOT NULL, Check2 BIT NOT NULL, CheckAll AS (Check1|Check2) )