Essa parece ser outra das muitas limitações dos índices filtrados. Tentar contorná-lo com o LIKE
uso WHERE column01 LIKE '_____'
também não funciona, produzindo a mesma mensagem de erro ( "Cláusula WHERE incorreta ..." ).
Além da VIEW
solução, outra maneira seria converter a coluna computada em uma coluna regular e adicionar uma CHECK
restrição para que ele sempre tenha dados válidos:
CREATE TABLE Table01 (column01 nvarchar(100),
column01_length int,
CHECK ( column01_length = len(column01)
AND column01 IS NOT NULL
AND column01_length IS NOT NULL
OR column01 IS NULL
AND column01_length IS NULL )
) ;
CREATE UNIQUE INDEX UIX_01 ON Table01 (column01) WHERE column01_length >= 5 ;
Testado em rextester.com
Naturalmente, isso significa que você precisa preencher explicitamente column01_length
com o tamanho correto sempre que preencher column01
(em inserções e atualizações). Isso pode ser complicado, porque você precisa garantir que o comprimento seja calculado da mesma maneira que o T-SQLLEN()
função . Em particular, os espaços à direita precisam ser ignorados, o que não é necessariamente o modo como o comprimento é calculado por padrão em várias linguagens de programação nas quais os aplicativos clientes são gravados. A lógica pode ser fácil de explicar no chamador, mas é necessário ciente da diferença em primeiro lugar.
Uma opção seria um INSERT/UPDATE
gatilho 1 para fornecer o valor correto para a coluna, para que apareça como calculado para aplicativos clientes.
1 Conforme explicado em Triggers Comparated to Constraints , você precisaria usar um gatilho INSTEAD OF para isso. Um gatilho AFTER nunca seria executado, porque o comprimento ausente falharia na restrição de verificação e isso, por sua vez, impediria a execução do gatilho. No entanto, gatilhos em vez de gatilhos têm suas próprias restrições (consulte Diretrizes de planejamento do gatilho DML para uma visão geral rápida).