I'm trying to create a computed column in order to have a unique index on a nullable column that ignores NULL rows1. I've composed this test case:
SELECT TEST_ID, CODE, UNIQUE_CODE, CAST(UNIQUE_CODE AS VARBINARY(4000)) AS HEX FROM ( SELECT TEST_ID, CODE, ISNULL(CODE, CONVERT(VARCHAR, SPACE(10)) + CONVERT(VARCHAR, TEST_ID)) AS UNIQUE_CODE FROM ( SELECT 1 AS TEST_ID, 'ABCDEFGHIJ' AS CODE UNION ALL SELECT 2, 'XYZ' UNION ALL SELECT 3, NULL ) TEST ) X; It works as expected when CODE is not null but I only get a string of whitespaces when CODE is null (i.e., the trailing TEST_ID is missing):
TEST_ID | CODE | UNIQUE_CODE | HEX --------+------------+-------------+----------------------- 1 | ABCDEFGHIJ | ABCDEFGHIJ | 0x4142434445464748494A 2 | XYZ | XYZ | 0x58595A 3 | NULL | | 0x20202020202020202020 The funny thing is that I already use this technique successfully in another table and I can't spot the difference:
CREATE TABLE SOME_OTHER_TABLE ( SOME_OTHER_TABLE_ID INT IDENTITY(1, 1) NOT NULL, NOMBRE VARCHAR(50), -- This works just fine: NOMBRE_UNICO AS ISNULL(NOMBRE, CONVERT(VARCHAR, SPACE(50)) + CONVERT(VARCHAR, SOME_OTHER_TABLE_ID)), CONSTRAINT SOME_OTHER_TABLE_PK PRIMARY KEY (SOME_OTHER_TABLE_ID) ); What am I missing?
(1) This was a workaround for SQL Server 2005 that's no longer necessary in later versions thanks to filtered indexes.

create index [idxName] on [yourTable] (Code) where Code IS NOT NULL?