Estou tentando copiar o conteúdo de 1 tabela de um banco de dados para outro em um servidor vinculado.
Estou usando a seguinte consulta para fazer isso
insert into [Schema].[Table] select * from [Server].[Database].[SCHEMA].[Table]
A consulta está falhando com o seguinte erro.
O provedor OLE DB 'SQLNCLI11' para o servidor vinculado 'ServerName' retornou dados inválidos para a coluna '[Server].[DATABASE].[SCHEMA].[TABLE].GDTXVC'.
Mesmo erro se eu listar os nomes das colunas, não tentei select *
por conta própria, porque é uma tabela de 3 milhões + linhas.
Verifiquei e verifiquei que a tabela é a mesma nos dois bancos de dados, a coluna que está sendo informada no erro é um TEXT
tipo de dado nas duas tabelas, e a coluna aceita NULL
em ambas também.
Apenas para descartar, corri DBCC CHECKTABLE() with data_purity
contra a tabela em questão e ela também não retornou erros. Eu não tenho certeza do que estou perdendo, ou onde mais eu deveria estar procurando.
Tabela Local - Destino
CREATE TABLE [CRPDTA].[F00165](
[GDOBNM] [char](10) NOT NULL,
[GDTXKY] [varchar](254) NOT NULL,
[GDLNGP] [char](2) NOT NULL,
[GDTXPO] [varchar](254) NULL,
[GDCRTU] [char](10) NULL,
[GDDQE] [numeric](18, 0) NULL,
[GDTENT] [float] NULL,
[GDMUSE] [char](10) NULL,
[GDUPMJ] [numeric](18, 0) NULL,
[GDTDAY] [float] NULL,
[GDEFTJ] [numeric](18, 0) NULL,
[GDEXDJ] [numeric](18, 0) NULL,
[GDPNTC] [char](1) NULL,
[GDISTM] [char](1) NULL,
[GDISFL] [char](1) NULL,
[GDTXTL] [float] NULL,
[GDIMGL] [float] NULL,
[GDOLEL] [float] NULL,
[GDMSCL] [float] NULL,
[GDFUTL] [float] NULL,
[GDTXVC] [text] NULL,
CONSTRAINT [F00165_PK] PRIMARY KEY CLUSTERED
(
[GDOBNM] ASC,
[GDTXKY] ASC,
[GDLNGP] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Servidor Remoto - Tabela de Origem
CREATE TABLE [PRODDTA].[F00165](
[GDOBNM] [char](10) NOT NULL,
[GDTXKY] [varchar](254) NOT NULL,
[GDLNGP] [char](2) NOT NULL,
[GDTXPO] [varchar](254) NULL,
[GDCRTU] [char](10) NULL,
[GDDQE] [numeric](18, 0) NULL,
[GDTENT] [float] NULL,
[GDMUSE] [char](10) NULL,
[GDUPMJ] [numeric](18, 0) NULL,
[GDTDAY] [float] NULL,
[GDEFTJ] [numeric](18, 0) NULL,
[GDEXDJ] [numeric](18, 0) NULL,
[GDPNTC] [char](1) NULL,
[GDISTM] [char](1) NULL,
[GDISFL] [char](1) NULL,
[GDTXTL] [float] NULL,
[GDIMGL] [float] NULL,
[GDOLEL] [float] NULL,
[GDMSCL] [float] NULL,
[GDFUTL] [float] NULL,
[GDTXVC] [text] NULL,
CONSTRAINT [F00165_PK] PRIMARY KEY CLUSTERED
(
[GDOBNM] ASC,
[GDTXKY] ASC,
[GDLNGP] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Definição de servidor vinculado
EXEC master.dbo.sp_addlinkedserver @server = N'<SERVERNAME>', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'<SERVERNAME>',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'rpc', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'rpc out', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'sub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'connect timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'collation name', @optvalue=null
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'lazy schema validation', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'query timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'<SERVERNAME>', @optname=N'remote proc transaction promotion', @optvalue=N'true'
O link parece bom, consegui copiar vários dados de outras tabelas por esse link, então tenho certeza de que o problema está confinado à tabela ou talvez aos dados nela.
Eu tenho duas cópias do banco de dados do qual tentei copiar os dados, uma de produção (SQL Server 2005), uma cópia restaurada em um servidor dev (2008). Estou tentando gravar os dados em um servidor SQL Server 2012. A definição da tabela é gerada pelo aplicativo, não posso alterá-la em nenhuma das extremidades.
Agrupamentos:
Ambos os bancos de dados têm um agrupamento de Chinese_PRC_CI_AS e as colunas também têm um agrupamento de Chinese_PRC_CI_AS em ambos os bancos de dados.
Tudo deve corresponder entre os dois bancos de dados, o novo banco de dados foi criado restaurando um backup do banco de dados de origem. Estou movendo dados pelo dblink agora, porque o banco de dados de origem está desatualizado porque a restauração foi feita há vários meses. Estou apenas movendo os dados conforme necessário para que os ambientes voltem a sincronizar.
janelas
Os servidores não estão executando a mesma versão do Windows. A origem está executando o Windows 2003 (32 bits) o destino está executando o Windows 2012. Não estou familiarizado o suficiente com os dados para dividi-los em consultas separadas, para a migração todos os dados precisam ser movidos, isso é tudo que tentei Faz.
Consultas de teste
As consultas a seguir funcionaram corretamente sem erros
SELECT TOP (1) [GDTXVC] from <SERVER>.<DATABASE>.<SCHEMA>.F00165;
SELECT TOP (1) [GDTXKY] FROM <SERVER>.<DATABASE>.<SCHEMA>.F00165;
INSERT INTO <SCHEMA>.F00165 ([GDOBNM], [GDTXKY], [GDLNGP], [GDTXVC]) SELECT TOP (1) [GDOBNM], [GDTXKY], [GDLNGP], [GDTXVC] FROM <SERVER>.<DATABASE>.<SCHEMA>.F00165;
Também abri um caso com o suporte do Microsoft Premier e tentarei manter essa pergunta atualizada com as etapas de solução de problemas que executo com a microsoft, bem como qualquer solução que eles possam ter/sugerir.
É provável que seus problemas sejam decorrentes de diferentes implementações da página de código 936 nas diferentes versões do sistema operacional Windows envolvidas.
Sugiro usar o utilitário bcp com a
-N
opção de exportar e importar em massa os dados por meio de um arquivo.A
-N
opção:Consulte Usar o formato nativo Unicode para importar ou exportar dados (SQL Server) na documentação do produto.
Linhas de comando de exemplo que usei para testar esse método em instâncias locais de 2008 e 2012:
Certifique-se de atender aos pré- requisitos para log mínimo na importação em massa para obter o melhor desempenho.
Muitas maneiras de esfolar gatos!
Como você configurou um LinkedServer, considere usar OPENQUERY() .
Por exemplo:
Acredito que se a tabela não existir em seu banco de dados de destino (o banco de dados para o qual você está copiando ), a única linha acima também criará a tabela para você. Na verdade, eu recomendaria que você fizesse dessa forma para ter certeza de que o banco de dados pode lidar com a cópia em um servidor separado.
Mas eu testaria seu servidor vinculado primeiro para ter certeza de que está funcionando: