初学者请教sql语句!!!!

shuguangleo 2012-06-04 04:12:54
我需要从远程数据库中读取数据,然后插入本地数据库中的表中,一下是sql语句:

Exec sp_droplinkedsrvlogin CServer,Null --删除隐射

Exec sp_dropserver CServer --删除服务器

EXEC sp_addlinkedserver --创建DBLINK

@server= 'CServer',--被訪問的服務器別名
@srvproduct= '',
@provider= 'SQLOLEDB',
@datasrc= '113.110.94.210,1433' --要訪問的服務器
EXEC sp_addlinkedsrvlogin
'CServer', --被訪問的服務器別名
'false',
NULL,
'sa', --帳號
'12345' --密碼
insert Test.dbo.Detect select * from CServer.test1.dbo.Detect1

以上语句均可执行。现在有以下几个问题:

1.新建作业时,以上语句放在1步里反复执行,第一行和第二行会报错,应为CServer还未创建,因此,如何用if语句判断CServer服务器和隐射是否存在?如果存在再执行,否则不执行第一行和第二行语句。

2.最后一行插入数据的时候,如何判断上次插入的结束点,使其反复执行的时候能够只插入新数据,而不是每次都把所有数据重新插一遍,这样会有重复。

3.如果远程数据库不止一个,只需要多写几个中间部分的代码创建多个'CServer'就可以了么?

各位高手,以上的sql语句如何修改?






...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2012-06-04
  • 打赏
  • 举报
回复
try this,

if exists(select 1 from sys.servers where name='CServer')
begin
Exec sp_droplinkedsrvlogin CServer,Null --删除隐射
Exec sp_dropserver CServer --删除服务器
end

EXEC sp_addlinkedserver --创建DBLINK
@server= 'CServer',--被訪問的服務器別名
@srvproduct= '',
@provider= 'SQLOLEDB',
@datasrc= '113.110.94.210,1433' --要訪問的服務器

EXEC sp_addlinkedsrvlogin
'CServer', --被訪問的服務器別名
'false',
NULL,
'sa', --帳號
'12345' --密碼

insert into Test.dbo.Detect
select a.*
from CServer.test1.dbo.Detect1 a
left join Test.dbo.Detect b on a.[主键]=b.[主键]
where b.[主键] is null
人生无悔 2012-06-04
  • 打赏
  • 举报
回复

--a 本地表 tablename 远程表 此处令其别名为b,若两表列若不同,将列列出即可,
--关联条件a的主键pk1,pk2和远程服务器表(此处别名b)的主键,有几个关联几个
insert into a
select * from [server].[database].[dbo].[tablename] b
where not exists (select 1
from a a1
where a1.pk1=b.pk1 and a1.pk2=b.pk2);
shuguangleo 2012-06-04
  • 打赏
  • 举报
回复
第二點
用本地的表加入not exists判斷不存在的就可以了,只取不存在的,將遠程表[svname].[dbname].[owner].[table]加入別名


not exists怎么用?[svname].[dbname].[owner].[table]怎么加?
shuguangleo 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
第一點:

SQL code


IF EXISTS (SELECT * FROM sys.linked_logins WHERE
server_id IN (SELECT server_id FROM sys.servers where name = 'CServer')
AND local_principal_id = (
select principal_……
[/Quote]

第二点比较关键,我不太明白你的意思,我是初学,你能把sql写出来么?
人生无悔 2012-06-04
  • 打赏
  • 举报
回复
第一點:

IF EXISTS (SELECT * FROM sys.linked_logins WHERE
server_id IN (SELECT server_id FROM sys.servers where name = 'CServer')
AND local_principal_id = (
select principal_id from sys.server_principals
where name = 'sa' and type in ('S', 'U')
))
Exec sp_droplinkedsrvlogin CServer,Null
go
IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'CServer')
EXEC master.dbo.sp_dropserver @server=N'CServer'
go

第二點
用本地的表加入not exists判斷不存在的就可以了,只取不存在的,將遠程表[svname].[dbname].[owner].[table]加入別名
第三點:
遠程服務器不一致,最好分開建job吧

34,597

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧