我正在尝试通过链接服务器将 1 个表的内容从一个数据库复制到另一个数据库。
我正在使用以下查询来这样做
insert into [Schema].[Table] select * from [Server].[Database].[SCHEMA].[Table]
查询失败并出现以下错误。
链接服务器 'ServerName' 的 OLE DB 提供程序 'SQLNCLI11' 为列 '[Server].[DATABASE].[SCHEMA].[TABLE].GDTXVC' 返回了无效数据。
如果我列出列名,也会出现同样的错误,我没有单独尝试select *
,因为它是一个 300 万行以上的表。
我已经检查并验证了两个数据库中的表是相同的,错误中报告的列是两个表中的TEXT
数据类型,并且该列也在两个表中都接受NULL
。
只是为了排除它,我跑到DBCC CHECKTABLE() with data_purity
有问题的表上,它也没有返回任何错误。我不确定我错过了什么,或者我应该去哪里寻找。
本地表 - 目的地
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]
远程服务器 - 源表
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]
链接服务器定义
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'
该链接似乎很好,我能够通过此链接复制多个其他表数据,所以我很确定问题仅限于表,或者可能是表中的数据。
我有两个数据库副本,我尝试从中复制数据,一个是生产环境(SQL Server 2005),一个是开发服务器上的恢复副本(2008)。我正在尝试将数据写入 SQL Server 2012 服务器。表定义是应用程序生成的,我无法在两端更改它。
归类:
两个数据库都有 Chinese_PRC_CI_AS 的排序规则,并且两个数据库中的列也有 Chinese_PRC_CI_AS 排序规则。
两个数据库之间的一切都应该匹配,新数据库是通过恢复源数据库的备份创建的。我现在正在通过 dblink 移动数据,因为源数据库现在已经过时了,因为恢复是在几个月前完成的。我只是根据需要移动数据以使环境恢复同步。
视窗
服务器未运行相同版本的 Windows。源正在运行 windows 2003(32 位),目标正在运行 windows 2012。我对数据不够熟悉,无法将其分成单独的查询,对于迁移,所有数据都需要移动,这就是我所尝试的做。
测试查询
以下查询均正常工作,没有错误
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;
我还打开了 Microsoft Premier 支持的案例,并将尝试通过我对 Microsoft 采取的故障排除步骤以及他们可能拥有/建议的任何解决方案来更新此问题。
您的问题很可能源于代码页 936在所涉及的不同 Windows 操作系统版本中的不同实现。
我建议使用带有通过文件批量导出和导入数据选项的 bcp 实用程序。
-N
-N
选项:请参阅产品文档中的使用 Unicode 本机格式导入或导出数据 (SQL Server)。
我用来在本地 2008 和 2012 实例上测试此方法的示例命令行:
确保您满足批量导入中最少日志记录的先决条件以获得最佳性能。
剥猫皮的方法很多!
由于您已经设置了 LinkedServer,请考虑使用OPENQUERY()。
例如:
我相信如果您的目标数据库(您要复制到的数据库)中不存在该表,上面的单行也会为您创建该表。事实上,我建议您这样做,以确保数据库可以通过单独的服务器处理副本。
但我会先测试您的链接服务器以确保它正常工作: