Eu estava apenas criando uma exibição vinculada ao esquema na qual queria colocar um índice (para experimentar algumas variações de colunas computadas).
Criei a view WITH SCHEMABINDING, então tive que criar um índice clusterizado antes de poder criar meus outros não clusterizados.
A tabela subjacente tem uma coluna de chave primária INT, então eu faria o índice clusterizado da exibição com base nisso. Então eu corri
Create UNIQUE CLUSTERED INDEX [cix_viewEvents_EventID] ON [dbo].[viewEvents] (EventID)
Para minha surpresa, após 4-5 minutos, recebi um
Msg 8152, string or binary data would be truncated
erro.
A única coluna no índice é um int; o que poderia estar ficando truncado?
Não encontrei nada relevante no google.
EDITAR:
A tabela original é assim,
CREATE TABLE [dbo].[Events](
[EventID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[EventTitle] [varchar](max) NOT NULL,
[EventContent] [varchar](max) NULL,
[EventDate] [datetime] NOT NULL,
CONSTRAINT [PK_Events] PRIMARY KEY CLUSTERED
(
[EventID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
enquanto a visão que eu criei ficou assim
CREATE VIEW dbo.viewEvents
WITH SCHEMABINDING
AS
SELECT EventID, EventTitle,
EventContent, EventDate, HASHBYTES('SHA1', EventContent) as ContentHash, HASHBYTES('SHA1',
EventTitle) as TitleHash
from dbo.Events;
Eu esperava acelerar as comparações no título e no conteúdo tendo hashes para comparar em vez de grandes bolhas de texto.
Em vez de adicionar as colunas computadas diretamente à tabela, pensei em tentar primeiro a exibição vinculada ao esquema, mas encontrei o "você precisa de um índice clusterizado na exibição antes de criar índices não clusterizados". Então tentei criar um índice clusterizado, conforme observado acima.
Estamos falando de um int em ambos os lugares, mas criando o índice clusterizado nas bombas de exibição com um erro de truncamento, o que não parece fazer sentido.
Veja o que a Microsoft diz sobre Create Indexed Views :
Como um índice clusterizado é composto pelas próprias linhas de dados, sua suposição de que "a única coluna no índice é um int" está incorreta porque, mesmo que apenas uma coluna tenha sido listada no DDL, a exibição do índice clusterizado deve conter todas as colunas sob o capô . Se fosse um índice não clusterizado, apenas as colunas listadas comporiam o índice.
Com o DDL que você forneceu eu consegui fazer alguns testes de laboratório e o seguinte gráfico do SSMS deve ilustrar meu ponto:
Como você pode ver, a visão tem praticamente o mesmo tamanho da tabela. E antes que o índice fosse criado, a exibição nem seria exibida no gráfico. Se fosse formado apenas pela coluna int como você pensou, teria um tamanho bem menor.
Essa informação junto com a contribuição do SMor sobre a limitação dos argumentos HASHBYTES para SQL Server 2008:
No meu laboratório gerei alguns dados com mais de 8000 bytes, mas como estou executando uma instância do SQL Server 2019, o DDL foi executado sem nenhum erro. Você pode verificar se tem algum valor que exceda esse limite com a seguinte consulta: