Para tirar isso do caminho, neste cenário, estamos reparando um banco de dados numérico onde nenhum backup foi feito antes da corrupção, portanto, restaurar um backup não é uma opção. Não é meu banco de dados :)
Ao executar o DBCC CHECKDB com REPAIR_ALLOW_DATA_LOSS, obtemos milhares de erros parecidos com este:
Msg 8928, Level 16, State 1, Line 7
Object ID 2105058535, index ID 1, partition ID 72057594038779904, alloc unit ID 72057594039762944 (type LOB data): Page (1:24911) could not be processed. See other errors for details.
Repairing this error requires other errors to be corrected first.
Msg 8965, Level 16, State 1, Line 7
Table error: Object ID 2105058535, index ID 1, partition ID 72057594038779904, alloc unit ID 72057594039762944 (type LOB data). The off-row data node at page (1:24911), slot 0, text ID 265289728 is referenced by page (1:24820), slot 0, but was not seen in the scan.
Repairing this error requires other errors to be corrected first.
Msg 8928, Level 16, State 1, Line 7
Object ID 2105058535, index ID 1, partition ID 72057594038779904, alloc unit ID 72057594039762944 (type LOB data): Page (1:24912) could not be processed. See other errors for details.
Repairing this error requires other errors to be corrected first.
Msg 8965, Level 16, State 1, Line 7
Table error: Object ID 2105058535, index ID 1, partition ID 72057594038779904, alloc unit ID 72057594039762944 (type LOB data). The off-row data node at page (1:24912), slot 0, text ID 265289728 is referenced by page (1:24820), slot 0, but was not seen in the scan.
Repairing this error requires other errors to be corrected first.
Msg 8928, Level 16, State 1, Line 7
Object ID 2105058535, index ID 1, partition ID 72057594038779904, alloc unit ID 72057594039762944 (type LOB data): Page (1:24913) could not be processed. See other errors for details.
Repairing this error requires other errors to be corrected first.
Executá-lo repetidamente não reduz os erros, portanto, parece que o DBCC não pode reparar isso.
Meu próximo pensamento foi tentar identificar e excluir as linhas problemáticas na tabela. Quando tentei excluir uma linha problemática conhecida, ela também errou, então meu pensamento atual é extrair linhas válidas conhecidas em uma nova tabela com o mesmo esquema da antiga, descartar a tabela antiga e renomear a nova para corresponder ao antigo.
O problema com isso é que o SQL Server, em vez de fornecer um erro detectável, simplesmente descarta a conexão sempre que uma linha com problema é encontrada, então não consigo encontrar uma maneira programática de identificar as linhas 'boas'.
Existe alguma maneira no T-SQL de forçá-lo a fornecer um bom erro capturável para que eu possa percorrer a tabela e extrair as linhas boas ou algum modo 'avançado' de DBCC CHECKDB que possa repará-lo que não é t óbvio em qualquer lugar na web?
Então, consegui obter uma correção para extrair os documentos de trabalho e, em seguida, eliminar a tabela de problemas graças à ajuda fornecida nos comentários.
O SQL abaixo por conta própria precisaria ser constantemente reexecutado manualmente, mas descobri que, colocando-o dentro de OPENQUERY para um SQL Server vinculado a si mesmo dentro de um bloco Try-Catch, consegui repetir o SQL até que ele foi feito.
Depois de concluído, basta renomear a tabela Documents_rep de volta para o nome original e descartar a tabela usada como uma correção rápida e suja para rastrear se a execução foi concluída.
Eu também me deparei com o problema de OpenQuery emitindo uma transação implícita e rollback que eu resolvi através do COMMIT; declarações durante todo o script.