Quando eu executo isso:
DROP TABLE IF EXISTS #QueryHashes;
CREATE TABLE #QueryHashes (query_hash BINARY(8) NOT NULL PRIMARY KEY);
PRINT CAST(0x0169857CCD5BBBE4E AS BINARY(8)); -- just testing that the value is a legitimate BINARY(8)
/* Insert your query_hash values inside the outer parenthesis below,
each wrapped in parenthesis, comma-separated (for example, "(0x89E35F2D4C638298), (0x89E35F2D4C638298)")
*/
INSERT INTO #QueryHashes (query_hash)
VALUES (0x0169857CCD5BBBE4E);
PRINT CAST(0x0169857CCD5BBBE4E AS BINARY(8)); -- just testing that the value is a legitimate BINARY(8)
Eu recebo este erro:
0x00169857CCD5BBBE Msg 2628, Nível 16, Estado 1, Linha 9 String ou dados binários seriam truncados na tabela 'tempdb.dbo.#QueryHashes______________________________________________________________________________________________________________000000000D06', coluna 'query_hash'. Valor truncado: ''. A instrução foi encerrada. 0x00169857CCD5BBBE
Observe que o valor na mensagem de erro parece ser uma string vazia.
Claramente, a inserção está falhando, enquanto as conversões funcionam. Alguém pode me ajudar a entender o que há de errado com a inserção ou definição da tabela? Mesmo se eu remover a "NOT NULL PRIMARY KEY", ainda recebo o mesmo erro.
(A intenção final é inserir alguns valores na tabela e juntá-los em uma grande consulta.)
Como observou @mustaccio, é porque seu valor tem 9 bytes. CAST truncará o valor para você se for muito longo. Veja abaixo -
Produz isso no console -