Pergunta

É possível ter uma coluna VARCHAR como uma chave primária com valores como 'A' e 'A', é sempre esse erro "Violação da restrição de chave primária" no MS SQL Server 2008. No Oracle, não dê nenhum erro. BTW, não estou implementando dessa maneira, estou apenas tentando migrar os dados do Oracle para o SQL Server.

Cumprimentos

Foi útil?

Solução

Você pode usar um text ou ntext Coluna, que depende do tipo de dados que você está importando e de seu comprimento - isso preservará os espaços. char os espaços de pântanos, por isso podem não ser adequados.

Outras dicas

O padrão SQL-92 determina que, para fins de comparação de string de caracteres, as strings são acolchoadas para ter o mesmo comprimento antes da comparação: normalmente o caractere do bloco é um espaço.

Portanto, 'a' e 'a' compara igual e isso viola a restrição de PK.http://support.microsoft.com/kb/316626

Não encontrei nada para indicar que esse comportamento mudou desde então.

Você pode se safar usando o varbinário em vez de varchar, mas isso pode não fazer o que você deseja.

Use um tipo de dados que não retire os espaços de direita.

Você pode tentar armazenar como varbinário e depois converter para Varchar quando selecionar.

Eu pensei que isso poderia ter algo a ver com Ansi_padding: mas meus testes aqui, indica que, para PKs (possivelmente índices exclusivos também, não tentados), isso ainda não ajuda, infelizmente.

Então:

SET ANSI_PADDING ON

Trabalha para campos não PK - ou seja, preserva o espaço à direita na inserção, mas por algum motivo não em PKs ...

Ver :

http://support.microsoft.com/kb/154886/en-us/

Você pode adicionar outra coluna à sua restrição de chave primária que mantém o comprimento dos dados na coluna Oracle. Isso permitirá que você importe os dados e reconstrua os dados do Oracle quando precisar - com uma visualização que usa o comprimento dos dados do Oracle, juntamente com o comprimento na tabela Microsoft para adicionar de volta os espaços ausentes para exibição em relatórios etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top