<3.2>进程被其他用户占用 当我们在远程分布式查询中有创建动作或是类似创建一个新的数据库. 有时会提示 “该数据库无法操作 已经别其他进程占用”异常. 导致我们无法访问数据库. 或是执行我们要做的创建操作. 遇到这种情况我们可以利用SA权限查询到Master数据库对应数据库被占用的进程 并杀掉Kill Process.查询: 1: -- [sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息。 2: -- 这些进程可以是客户端进程或系统进程。sysprocesses 只存储在 master 数据库中] 4: use Master 5: go 7: SELECT * FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='CustomerDB' 9: select * from sysprocesses 11: select * from sysdatabases 13: -- 杀死占用进程 14: kill 5
当我们对进程占用清除时有可能访问数据库被系统进程占用. 则这时用Sa无法杀死.这时提示:
“Only use Process can be Kill ”在SQl2005 只有只有用户进程才能Kill掉. <3.3>更多的查询操作 往往我们在实际操作中需要对数据读写有更多要求. 例如从远程连接多个服务器进行数据读取或是把本地数据提交到服务器上. 为了提高效率和性能采用分布式事务来进行批量操作等等. 如下简单介绍在分布式查询中多中数据操作: 把远程数据导入本地: 1: -- 导入数据操作 2: select top(3) * into TestDB.dbo.CopyDb from [192.168.10.76].wl.dbo.Users
导入时使用Into方式 自动在本地创建CopyDB表完全复制远程服务器上Users表的数据结构.但是要注意在进行后 的CopyDB将不包含原表的主键和索引约束. 虽然能快构建 但是主键和索引设置都会丢失. 本地数据导入远程: -- 把本地表导入远程表 [openWset方式] insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) select *from 本地表 -- 把本地表导入远程表 [open Query方式] insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') 更新本地表数据: 1: -- 把本地表导入远程表 [opendataSource方式] 2: insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 3:
4: -- 更新本地表 [openowset方式] 5: update b set b.列A=a.列A from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 6: as a inner join 本地表 b on a.column1=b.column1
当然还有更多方式来操作分布式查询操作.各位都可以尝试.
<4>尾 语
如上是我最近在项目中处理关于分布式查询涉及到方方面面. 从系统架构到分部是查询具体操作细节.基本都是一些非常基础运用.当然也参考不少资料.以及动手来验证整个过程出现问题原因所在. 篇幅有限 写的有些仓促. 难免有纰漏地方 还望各位指正. (责任编辑:admin) |