SQL Server复制中错误处理__收藏

在SQL Server的复制中出现在错误“应用复制的命令时在订阅服务器上找不到该行”,换上以前的做法就是删除掉这个复制,然后再新建一个复制,但是这次,我突然想BAIDU一下,看看别人是怎么处理这个问题的,然后发现找到的文章都是从MSDN上抄下来的,因此我决定把我的做法写下来。

  首先查MSDN,确定这个错误的ID为20598,这个下面会用到;确定了错误ID之后,有两种方法可以跳过这个错误

  第一种是使用“右键-》复制-》分发服务器属性-》默认配置文件-》然后新建一个新的配置文件,”这样子就可以让分发的所有复制都使用新的配置文件,一般用来修改一些公共的参数。

  第二种是打开复制监视器,然后双击你要修改的那个复制,在“操作”菜单下有个代理配置文件,打开它后新建一个配置文件,然后使用这个配置文件,这种方法用来修改单个的复制的参数。

  新建后修改-SkipErrors这一项,点“值”栏后输入刚刚查到的ID号,就是20598,点确定,然后勾上你刚刚新建的这个配置文件。

  重启代理,打开复制监视器,你会发现它已经跳过了这个错误。

  如果是对等数据复制的话,要慎用,因为可能导致两个数据库的数据不一致,请先查明原因,然后再决定是否要跳过这个错误。 

  于事务性复制,有两种方法可以跳过在分发过程中遇到的错误:

  分发代理的 -SkipErrors 参数,可用来跳过某种类型的错误。有错误的事务将不提交,但后续的事务将提交。

  sp_setsubscriptionxactseqno 存储过程,可用来跳过一个或多个导致错误的事务。非SQL Server 的订阅服务器没有此选项。

  重要事项:

  在典型的复制处理中,应该不会遇到任何需要跳过的错误。跳过错误时要谨慎,要了解发生错误的条件、错误的起因以及需要跳过错误或特定事务而不解决的理由。如果在订阅服务器上跳过发布服务器上提交的事务,则这两个节点就不会完全同步,这会导致其他错误。

  -SkipErrors 参数:

  默认情况下,发布代理遇到错误时就会停止。如果使用 -SkipErrors 参数,并指定了预期的或不想让其干扰复制的错误,则代理就会记录错误信息,然后继续运行。例如,如果要指定分发代理,使其记录重复键违规但继续处理后续事务,就需要指定代理跳过错误 2601(不能在具有唯一索引 ’%.*ls’ 的对象 ’%.*ls’ 中插入重复键的行。)和 2627(违反了 %ls 约束 ’%.*ls’。不能在对象 ’%.*ls’ 中插入重复键): -SkipErrors 2601;2627

--------------------------------------------------------------------------------------------------------

附: Mssql错误代码对照表

错误消息

MSSQL_ENG002601

不能在具有唯一索引 '%.*ls' 的对象 '%.*ls' 中插入重复键的行。

MSSQL_ENG002627

违反了 %ls 约束 '%.*ls'。不能在对象 '%.*ls' 中插入重复键。

MSSQL_ENG003165

数据库 '%ls' 已还原,但在还原/删除复制时出错。该数据库仍保留为离线状态。请参阅 SQL Server 联机丛书中的主题 MSSQL_ENG003165。

MSSQL_ENG003724

无法对 %S_MSG '%.*ls' 执行 %S_MSG,因为它正用于复制。

MSSQL_ENG004929

无法更改 %S_MSG '%.*ls',因为正在为复制而发布它。

MSSQL_ENG007395。请参阅对 Oracle 发布服务器进行故障排除

无法启动链接服务器“%ls”的 OLE DB 访问接口“%ls”的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。

MSSQL_ENG014005

无法删除发布。该发布已有订阅。

MSSQL_ENG014010

未将服务器“%s”定义为订阅服务器。

MSSQL_ENG014114

未将 '%s' 配置为分发服务器。

MSSQL_ENG014117

未将 '%s' 配置为分发数据库。

MSSQL_ENG014120

无法删除分发数据库 '%s'。此分发服务器数据库与发布服务器相关联。

MSSQL_ENG014121

无法删除分发服务器 '%s'。此分发服务器与分发数据库相关联。

MSSQL_ENG014144

无法删除订阅服务器 '%s'。在发布数据库“%s”中已有此服务器的订阅。

MSSQL_ENG014150

复制 - %s:代理 %s 成功。%s

MSSQL_ENG014151

复制 - %s: 代理 %s 失败。%s

MSSQL_ENG014152

复制 - %s:代理 %s 计划重试。%s

MSSQL_ENG014157

由发布 '%s' 的订阅服务器 '%s' 创建的订阅已过期,且已停止。

MSSQL_ENG014160

已设置发布 [%s] 的阈值 [%s:%s]。此发布的一个或多个订阅已过期。

MSSQL_ENG014161

已设置发布 [%s] 的阈值 [%s:%s]。请确保日志读取器和分发代理正在运行并且可以满足滞后时间要求。

MSSQL_ENG014162

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG014163

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG014164

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG014165

已设置发布 [%s] 的阈值 [%s:%s]。请确保合并代理正在运行且符合要求。

MSSQL_ENG018456

用户 '%.*ls'.%.*ls 登录失败

MSSQL_ENG018752

一次只能有一个日志读取器代理或日志相关过程(sp_repldone、sp_replcmds 和 sp_replshowcmds)连接到某个数据库。如果执行了一个日志相关过程,那么在启动日志读取器代理或者执行另一个日志相关过程之前,请删除执行 第一个过程时所用的连接,或者在该连接上执行 sp_replflush。

MSSQL_ENG020554

复制代理在 %ld 分钟内没有记录任何进度消息。这表明代理已停止响应或系统活动过多。请确保正在将记录复制到目标,并且与订阅服务器、发布服务器和分发服务器的连接仍然是活动的。

MSSQL_ENG020557

代理关闭。有关详细信息,请参阅作业 '%s' 的 SQL Server 代理作业历史记录。

MSSQL_ENG020572

在验证失败之后,订阅服务器“%s”对发布“%s”中项目“%s”的订阅已被重新初始化。

MSSQL_ENG020574

订阅服务器“%s”对发布“%s”中项目“%s”的订阅未通过数据验证。

MSSQL_ENG020575

订阅服务器“%s”对发布“%s”中项目“%s”的订阅已通过数据验证。

MSSQL_ENG020596

只有 '%s' 或 db_owner 的成员可以删除匿名代理。

MSSQL_ENG020598

应用复制的命令时在订阅服务器上找不到该行。

MSSQL_ENG021075

发布 '%s' 的初始快照尚不可用。

MSSQL_ENG021076

项目 '%s' 的初始快照尚不可用。

MSSQL_ENG021286

冲突表 '%s' 不存在。

MSSQL_ENG021330

无法在复制工作目录下创建子目录。(%ls)

MSSQL_ENG021331

无法将用户脚本文件复制到分发服务器。(%ls)

MSSQL_ENG021385

快照无法处理发布 '%s'。可能是由于活动架构的更改操作或者是所添加的新项目所致。

MSSQL_ENG021617。请参阅对 Oracle 发布服务器进行故障排除

无法运行 SQL*PLUS。请确保分发服务器上安装了最新版本的 Oracle 客户端代码。

MSSQL_ENG021620。请参阅对 Oracle 发布服务器进行故障排除

通过系统 Path 变量获得的 SQL*PLUS 版本不够新,无法支持 Oracle 发布。请确保分发服务器上安装了最新版本的 Oracle 客户端代码。

MSSQL_ENG021624。请参阅对 Oracle 发布服务器进行故障排除

在分发服务器 '%s' 上找不到已注册的 Oracle OLEDB 访问接口 OraOLEDB.Oracle。请确保分发服务器上安装并注册了最新版本的 Oracle OLEDB 访问接口。有关其他信息,请参阅 SQL Server 联机丛书中“排除 Oracle 发布服务器故障”中的“SQL Server 错误 21624”。

MSSQL_ENG021626。请参阅对 Oracle 发布服务器进行故障排除

无法使用 Oracle OLEDB 访问接口 OraOLEDB.Oracle 连接到 Oracle 数据库服务器 '%s'。

MSSQL_ENG021627。请参阅对 Oracle 发布服务器进行故障排除

无法使用 Microsoft OLEDB 访问接口 MSDAORA 连接到 Oracle 数据库服务器 '%s'。

MSSQL_ENG021628。请参阅对 Oracle 发布服务器进行故障排除

无法更新分发服务器 '%s' 的注册表,以允许 Oracle OLEDB 访问接口 OraOLEDB.Oracle 与 SQL Server 一起在进程中运行。请确保当前登录名有权修改 SQL Server 拥有的注册表项。

MSSQL_ENG021629。请参阅对 Oracle 发布服务器进行故障排除

指示 Oracle 的 Oracle OLEDB 访问接口 OraOLEDB.Oracle 已注册的 CLSID 注册表项不在分发服务器上。请确保分发服务器上安装并注册了 Oracle OLEDB 访问接口。

MSSQL_ENG021642。请参阅对 Oracle 发布服务器进行故障排除

异类发布服务器需要链接服务器。已有一个名为 '%s' 的链接服务器。请删除链接服务器或另选一个发布服务器名称。

MSSQL_ENG021663。请参阅对 Oracle 发布服务器进行故障排除

找不到源表 [%s].[%s] 的有效主键。

MSSQL_ENG021684。请参阅对 Oracle 发布服务器进行故障排除

“Oracle 发布服务器 "%s" 的复制管理用户权限不足。有关所需权限,请参阅脚本 /MSSQL/Install/oracleadmin.sql。”

MSSQL_ENG021797

'%s' 必须是有效的 Windows 登录名,且格式为:'计算机\登录名' 或 '域\登录名'。请参阅 '%s' 的文档。

MSSQL_ENG021798

在继续操作之前,必须通过“%s”添加“%s”代理作业。请参阅 '%s' 的文档。

MSSQL_ENG024070

客户端没有所需的特权。

MSSQL_REPL020011

进程无法在“%2”上执行“%1”。

MSSQL_REPL027056

合并进程无法更改“%1”上的生成历史记录。进行故障排除时,请使用详细的历史日志记录来重新启动同步,并指定要写入的输出文件。

MSSQL_REPL027183

合并进程未能使用参数化的行筛选器来枚举项目中的更改。如果此操作仍失败,请增大该进程的查询超时值,缩短发布的保持期,并改进对已发布表的索引。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方式的用法。 先建立一个表,并添加一些数据来进行演示: 复制代码 CREATE TABLE t_student( Id INT NOT NULL, Name NVARCHAR (10) NULL, Age TINYINT NULL, School NVARCHAR(20) NULL, Class NVARCHAR(10) NULL, Score FLOAT NULL, CONSTRAINT [PK_Student_Id] PRIMARY KEY CLUSTERED(Id) ) GO INSERT INTO t_student VALUES(1,'张小红',8,'育才小学','一班',92) INSERT INTO t_student VALUES(2,'王丽丽',8,'育才小学','一班',90) INSERT INTO t_student VALUES(3,'张燕',7,'云华小学','二班',86) INSERT INTO t_student VALUES(4,'刘华',6,'云华小学','二班',85) 复制代码 一、EXEC EXEC命令可以执行一个存储过程也可以执行一个动态SQL语句。先来看看怎么执行存储过程: 新建一个存储过程 SP_GetStudent ,返回 成绩大于90 分的学生: 复制代码 CREATE PROCEDURE [dbo].[Sp_GetStudent] @Score FLOAT, @Nums INT OUTPUT AS BEGIN SET NOCOUNT ON; SELECT * FROM t_student WHERE Score >=@Score SELECT @Nums=COUNT(1) FROM t_student WHERE Score >=@Score IF(@Nums>0) RETURN 1 ELSE RETURN 0 END GO 复制代码 该存储过程涉及了 查询操作、返回值和输出参数,我们来看用EXEC 命令如何调用: 复制代码 DECLARE @return_value int, @OutNums int EXEC @return_value = [dbo].[Sp_GetStudent] @Score = 90, @Nums = @OutNums OUTPUT SELECT @OutNums as N'大于90分的人数' SELECT '返回值' = @return_value GO 复制代码 执行结果: 我们发现EXEC 执行存储过程和我们平时程序执行一个方法是几乎一样的,返回值参数 直接就可以等于存储过程的执行后的返回值,输出参数 在后面需要增加 OUTPUT 关键字。 执行存储过程不是重点,重点是执行动态sql语句,同样看一下例子: DECLARE @TableName NVARCHAR(50),@Sql NVARCHAR(MAX),@Score INT; SET @TableName = 't_Student'; SET @Score = 90; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE Score >= '+CAST(@Score AS NVARCHAR(10)) EXEC (@sql); 执行结果: 注意:在执行拼接SQL 语句的时候,的EXEC括号只允许包含一个字符串变量,但是可以串联多个变量,如果我们直接执行这个SQL语句: --这是错误的调用 EXEC ('SELECT * FROM '+QUOTENAME(@TableName) +'WHERE Score >= '+CAST(@Score AS NVARCHAR(10))); 执行就会提示错误。但是这样就没有问题: 复制代码 DECLARE @TableName NVARCHAR(50),@Sql NVARCHAR(MAX),@Score INT DECLARE @Sql2 NVARCHAR(MAX) SET @TableName = 't_Student'; SET @Score = 90; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) SET @Sql2=' WHERE Score >= '+CAST(@Score AS NVARCHAR(10)) EXEC (@sql+@sql2) 复制代码 EXEC 执行拼接sql语句的时候不支持 嵌入式参数,如下: DECLARE @OUT_Nums INT,@IN_Score INT,@Sql NVARCHAR(MAX) SET @IN_Score = 90 SET @sql = 'SELECT @Nums=COUNT(1) FROM t_student WHERE Score >= @Score' EXEC (@sql) 通过上面的代码发现,EXEC 执行拼接的SQL语句的时候,不支持内嵌参数,包括输入参数和输出参数。有的时候我们想把得到的count(*)传出来,用EXEC是不好办到的。接下来,再来看看SP_EXECUTESQL的使用: 二、SP_EXECUTESQL: SP_EXECUTESQL 是在 SQL 2005引入的新的系统存储过程,也是用来处理动态SQL 语句的。它比EXEC 更加灵活,首先也执行一下第一次的拼接SQL语句: DECLARE @TableName NVARCHAR(50),@Sql NVARCHAR(MAX),@Score INT; SET @TableName = 't_Student'; SET @Score = 90; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE Score >= '+CAST(@Score AS NVARCHAR(10)) EXEC SP_EXECUTESQL @sql --注意这里没有了() 执行结果: SP_EXECUTESQL 支持内嵌参数: 先来看一下SP_EXECUTESQL的语法: sp_executesql [ @stmt = ] stmt [ {, [@params=] N'@parameter_name data_type [ OUT | OUTPUT ][,...n]' } {, [ @param1 = ] 'value1' [ ,...n ] } ] 说明: [ @stmt = ] stmt 包含 Transact-SQL 语句或批处理的 Unicode 字符串。stmt 必须是 Unicode 常量或 Unicode 变量。不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符连接两个字符串)。不允许使用字符常量。如果指定了 Unicode 常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。在 64 位服务器,字符串大小限制为 2 GB,即 nvarchar(max) 的最大大小。stmt 包含的每个参数在 @params 参数定义列表和参数值列表均必须有对应项 [ @params = ] N'@parameter_namedata_type[ ,... n ] ' 包含 stmt 嵌入的所有参数定义的字符串。字符串必须是 Unicode 常量或 Unicode 变量。每个参数定义由参数名称和数据类型组成。n 是表示附加参数定义的占位符。在 stmt 指定的每个参数必须在 @params 定义。如果 stmt 的 Transact-SQL 语句或批处理不包含参数,则不需要 @params。该参数的默认值为 NULL。 [ @param1 = ] 'value1' 参数字符串定义的第一个参数的值。该值可以是 Unicode 常量,也可以是 Unicode 变量。必须为 stmt 包含的每个参数提供参数值。如果 stmt 的 Transact-SQL 语句或批处理没有参数,则不需要这些值。 [ OUT | OUTPUT ] 指示参数是输出参数。除非是公共语言运行 (CLR) 过程,否则 text、ntext 和 image 参数均可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以为游标占位符,CLR 过程除外。 n 附加参数值的占位符。这些值只能为常量或变量,不能是很复杂的表达式(例如函数)或使用运算符生成的表达式。 返回代码值 : 0(成功)或非零(失败) 结果集:从生成 SQL 字符串的所有 SQL 语句返回结果集 看不懂没有关系,通过例子就会非常明白的,依旧还执行上面的 SQL 语句: DECLARE @OUT_Nums INT,@IN_Score INT,@Sql NVARCHAR(MAX) SET @IN_Score = 90 SET @sql = 'SELECT @Nums=COUNT(1) FROM t_student WHERE Score >= @Score' EXEC SP_EXECUTESQL @sql,N'@Nums INT OUT,@Score INT',@OUT_Nums OUTPUT,@IN_Score SELECT @OUT_Nums AS '人数' 执行结果: 需要注意的是: 1、要求动态Sql和动态Sql参数列表必须是NVARCHAR 2、动态Sql的参数列表与外部提供值的参数列表顺序必需一致 3、一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递,比如: DECLARE @OUT_Nums INT,@IN_Score INT,@Sql NVARCHAR(MAX) SET @IN_Score = 90 SET @sql = 'SELECT @Nums=COUNT(1) FROM t_student WHERE Score >= @Score' EXEC SP_EXECUTESQL @stmt=@sql,@params=N'@Nums INT OUT,@Score INT',@Nums=@OUT_Nums OUTPUT,@Score=@IN_Score SELECT @OUT_Nums AS '人数' 通过上面的例子已经很清晰的表明了,在执行动态SQL 语句的时候,EXEC 和 SP_EXECUTESQL 的区别了,来总结一下: 1、 性能: 官方描述:sp_executesql stmt 参数的 Transact-SQL 语句或批处理在执行 sp_executesql 语句时才编译。随后,将编译 stmt 的内容,并将其作为执行计划运行。该执行计划独立于名为 sp_executesql 的批处理的执行计划。sp_executesql 批处理不能引用调用 sp_executesql 的批处理声明的变量。sp_executesql 批处理的本地游标或变量对调用 sp_executesql 的批处理是不可见的。对数据库上下文所做的更改只在 sp_executesql 语句结束前有效。如果只更改了语句的参数值,则 sp_executesql 可用来代替存储过程多次执行 Transact-SQL 语句。因为 Transact-SQL 语句本身保持不变,仅参数值发生变化,所以 SQL Server 查询优化器可能重复使用首次执行时所生成的执行计划。 说通俗一点就是:如果用 EXEC 执行一条动态 SQL 语句,由于每次传入的参数不一样,所以每次生成的 @sql 就不一样,这样每执行一次SQL SERVER 就必须重新将要执行的动态 Sql 重新编译一次 。但是SP_EXECUTESQL 则不一样,由于将数值参数化,要执行的动态 Sql 永远不会变化,只是传入的参数的值在变化,那每次执行的时候就不用重新编译,速度和效率自然有所提升。 2、从上面的例子我们已经能够看出 SP_EXECUTESQL 命令比 EXEC 命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。 3、EXEC 执行纯动态SQL,执行时可能无法使用预编译的执行计划,关键是不安全,可以导致 SQL 注入 ,而 SP_EXECUTESQL 执行参数化动态 SQL ,执行时能使用预编译的执行计划,而且保存存储过程时就可以确定可以使用的预编译的执行计划,而且最重要的是“安全”,天然免疫SQL 注入 作者:Rising Sun 出处:http://www.cnblogs.com/lxblog/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
完整清晰 PDF 扫描文档 这个PDF文件是我花钱买来的,现在为了挣积分,拿出来与大家分享!! -------------------------------------------------------------------------------- SQL Server 2008高级程序设计 2/6 SQL Server 2008 2010 高级程序设计 作者:(美)维埃拉 著,杨华,腾灵灵 译 出版社:清华大学 出版日期:2010-4-1 ISBN:9787302222729 字数:1250000 页码:730 -------------------------------------------------------------------------------- 内容提要 -------------------------------------------------------------------------------- Microsoft SQL Server 2008极大地完善了数据库引擎的核心组件,也改变了数据库应用程序的构建方式。《SQL Server 2008高级程序设计》由世界顶尖SQL Server权威专家Robert Vieira编写,旨在指导您熟练运用一系列日趋复杂的功能,助您更高效地管理数据。   本书首先介绍SQL Server 2008的新功能,然后在更详实的示例代码的引导下全面深入地展开论述,讨论了如何编写复杂查询、构建各种数据结构以及提高应用程序性能,还讲述了如何管理高级脚本和数据库以及如何确定和改正脚本错误。   本书提供了快速创建和部署数据驱动的解决方案来满足业务需求的信息,介绍了新数据类型、索引结构、管理功能和高级时区处理等重要内容,掌握这些知识后,您将使自己的数据库发挥㈩最大功效。   主要内容   ◆除规范化外的数据设计技巧   ◆尽量提高应用程序运行速度的方法   ◆有关存储过程和用户定义函数的全部内容   ◆存储过程的高级处理方法   ◆报表服务和集成服务的用法   ◆提高数据库安全性的提示信息   ◆如何利用XML和XQuery支持   ◆通过修改特定数据值进行推理分析的步骤   读者对象   本书面向想要学用所有SQL Server 2008功能的有经验的开发人员。 目录 -------------------------------------------------------------------------------- 第1章 回顾SQL Server的对象  1.1 数据库的构成  1.2 数据库对象概述  1.3 SQL Server数据类型  1.4 SQL Server对象标识符  1.5 小结 第2章 工具  2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 构建嵌套子查询  3.3 相关子查询  3.4 派生表  3.5 EXISTS运算符  3.6 INTERSECT和EXCEPT运算符  3.7 通用表表达式(CTE)  3.8 递归查询  3.9 合并  3.10 利用外部调用完成复杂操作  3.11 性能考虑  3.12 小结 第4章 XML集成  4.1 XML数据类型  4.2 提取XML格式的关系数据  4.3 有关XML索引的提示  4.4 层次数据概述  4.5 小结 第5章 细心推敲,大胆设计  5.1 进一步了解规范化  5.2 关系  5.3 图表  5.4 逻辑设计与物理设计  5.5 通过经典的BLOB处理基于文件的信息  5.6 子类别  5.7 数据库重用  5.8 反规范化  5.9 通过分区方法进行扩展  5.10 SQL Server关系图工具  5.11 关于日期列  5,12 小结 第6章 核心存储和索引结构  6.1 SQL Server存储  6.2 理解索引  6.3 创建、修改和删除索引  6.4 明智地决定何时何地使用何种索引  6.5 维护索引  6.6 小结 第7章
好的,以下是一个简单的C++程序,可以实现复制SQL Server数据库所有表到本地: ```c++ #include <iostream> #include <windows.h> #include <sqltypes.h> #include <sql.h> #include <sqlext.h> using namespace std; int main() { SQLHANDLE handleEnv = NULL; SQLHANDLE handleConn = NULL; SQLHANDLE handleStmt = NULL; // 连接数据库 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &handleEnv); SQLSetEnvAttr(handleEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, handleEnv, &handleConn); SQLConnect(handleConn, (SQLCHAR*)"your_server_name", SQL_NTS, (SQLCHAR*)"your_username", SQL_NTS, (SQLCHAR*)"your_password", SQL_NTS); // 获取所有表名 SQLAllocHandle(SQL_HANDLE_STMT, handleConn, &handleStmt); SQLCHAR sql_select_tables[] = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='your_database_name'"; SQLExecDirect(handleStmt, sql_select_tables, SQL_NTS); // 逐个表复制数据 SQLCHAR table_name[256]; while (SQLFetch(handleStmt) == SQL_SUCCESS) { SQLGetData(handleStmt, 1, SQL_C_CHAR, table_name, sizeof(table_name), NULL); // 查询表的数据 SQLCHAR sql_select_data[512]; sprintf_s((char*)sql_select_data, sizeof(sql_select_data), "SELECT * FROM %s", table_name); SQLExecDirect(handleStmt, sql_select_data, SQL_NTS); // 保存数据到本地文件 SQLCHAR file_name[256]; sprintf_s((char*)file_name, sizeof(file_name), "%s.txt", table_name); FILE* fp; fopen_s(&fp, (char*)file_name, "w+"); while (SQLFetch(handleStmt) == SQL_SUCCESS) { SQLCHAR row_data[1024]; SQLINTEGER cbData; for (int i = 1; i <= SQLNumResultCols(handleStmt); i++) { SQLGetData(handleStmt, i, SQL_C_CHAR, row_data, sizeof(row_data), &cbData); fprintf_s(fp, "%s\t", row_data); } fprintf_s(fp, "\n"); } fclose(fp); } // 释放资源 SQLFreeHandle(SQL_HANDLE_STMT, handleStmt); SQLDisconnect(handleConn); SQLFreeHandle(SQL_HANDLE_DBC, handleConn); SQLFreeHandle(SQL_HANDLE_ENV, handleEnv); return 0; } ``` 需要注意的是,这个程序仅供参考,具体的实现方式可能因为环境和需求的不同而有所变化。在实际使用,还需要加入错误处理、安全措施等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值