none
初学者请教Transact-SQL编程高手问题。 RRS feed

  • 问题

  • 我需要从远程数据库中读取数据,然后插入本地数据库中的表中,一下是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语句如何修改?

    2012年6月4日 8:14

答案

  • 第二个结束点的问题,这个没有现成的,你只能根据表中的数据记录情况自己去做,比如在表中加一个 temestamt 列,每次操作后,记录下这个列的最大值,下次从这个值开始取数据

    第3个问题,看你的描述,是服务顺(实例)不一样吧?多个服务器,确实只需要创建多个链接服务器就行了(名字不能一样)

    如果是同一个服务器(实例)下的不同数据库,你只需要在访问有语句中指定要访问的数据库名就行了

    select * from CServer.test1.dbo.Detect1

    select * from CServer.数据库1.dbo.Detect1

    2012年6月4日 9:17
  • insert Test.dbo.Detect
    
    select * from CServer.test1.dbo.Detect1 a left join Test.dbo.Detect b
    
    on a.id=b.id --主键
    
    where b.id is null 

    插入新数据,存在的就不插入了...

    2012年6月4日 13:48
    版主

全部回复

  • 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' --密碼


    这个执行一次,创建好链接服务器,以后直接使用这个链接服务器来访问数据就行了,不需要在每次访问数据的时候去重建
    2012年6月4日 9:12
  • 哦。也对。

    但是第二个问题怎么解决?我Transact-SQL不太好,这里涉及到编程?

    2012年6月4日 9:16
  • 第二个结束点的问题,这个没有现成的,你只能根据表中的数据记录情况自己去做,比如在表中加一个 temestamt 列,每次操作后,记录下这个列的最大值,下次从这个值开始取数据

    第3个问题,看你的描述,是服务顺(实例)不一样吧?多个服务器,确实只需要创建多个链接服务器就行了(名字不能一样)

    如果是同一个服务器(实例)下的不同数据库,你只需要在访问有语句中指定要访问的数据库名就行了

    select * from CServer.test1.dbo.Detect1

    select * from CServer.数据库1.dbo.Detect1

    2012年6月4日 9:17
  • 第二个问题:

    你说的意思是给远程服务器取数据的表中加一个标识列么?但是这个值保存在那里,C#程序我可以定义变量,每次从变量里取值。sql语句存哪里?而且这个作业在以后的循环里,还能记得这个值么?

    2012年6月4日 9:56
  • 或者不用加标识列。取数据的表中的字段有创建时间,我可以判断这个时间,但是问题就是,每取完一次,这个时间存到哪里?下次执行的时候能用这个时间作为判断条件,晚于这个时间的就是新数据,就可以select出来插入本地。

    而且,这个作业按计划循环的时候,这个村时间的变量还在么?我sql编程不好。

    2012年6月4日 10:08
  • Or create a table in local db to keep time.
    2012年6月4日 13:43
  • insert Test.dbo.Detect
    
    select * from CServer.test1.dbo.Detect1 a left join Test.dbo.Detect b
    
    on a.id=b.id --主键
    
    where b.id is null 

    插入新数据,存在的就不插入了...

    2012年6月4日 13:48
    版主