各位大虾:我在本机上,使用vba编程,通过shell调用bcp工具,可以正常的导入txt数据到本机上的SQL SERVER(tab键分字段,dos换行符)我在服务器上,也可以使用bcp工具正常导入该txt文件到 Server上的 SQL 数据库。但是当我把本机上的txt数据通过bcp工具导入服务器上的SQL数据库时,却发觉没有成功?也没有报错...侦听本机和服务器上的1433端口,都没有问题。。是established 正在通信状态。
我尝试着在vba中写入SQL语句(删除数据,插入数据),都能正常的把Server端的数据删除/插入。
请问,这是怎么回事啊? 是我哪儿设置不对么?

解决方案 »

  1.   

    /*不同服务器数据库之间的数据操作*/--创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
    exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 
    select * from ITSV.数据库名.dbo.表名 --导入示例 
    select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器 
    exec sp_dropserver  'ITSV ', 'droplogins ' --连接远程/局域网数据(openrowset/openquery/opendatasource) 
    --1、openrowset --查询示例 
    select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --生成本地表 
    select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --把本地表导入远程表 
    insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 
    select *from 本地表 --更新本地表 
    update b 
    set b.列A=a.列A 
     from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b 
    on a.column1=b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
    --查询 
    select * 
    FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
    --把本地表导入远程表 
    insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
    select * from 本地表 
    --更新本地表 
    update b 
    set b.列B=a.列B 
    FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a  
    inner join 本地表 b on a.列A=b.列A --3、opendatasource/openrowset 
    SELECT   * 
    FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 
    --把本地表导入远程表 
      

  2.   

    if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
    drop procedure File2Table
    go/*--实现数据导入/导出的存储过程 可以实现导入/导出 整个数据库/指定表 到文本文件--邹建 2003.07(引用请保留此信息)--*//*--调用示例 --导出指定表
    exec file2table @tbname=N'jobs,pub_info',@filename='c:\[@tbname].txt' --导出所有表
    exec file2table @filename='c:\[@dbname]_[@tbname].txt' --导入所有表
    exec file2table @filename='c:\[@dbname]_[@tbname].txt',@isout=0
    --*/
    create procedure File2Table
    @tbname nvarchar(4000)='',   --表名列表,如果不指定,则表示所有用户表
    @filename nvarchar(1000)='', --导出的文件名,如果不指定,导出到SQL Server的默认备份目录\[@dbname]_[@tbname].txt,其中[@dbname]在处理中会替换为数据库名,[@dbname]会用表名代替
    @isout bit=1,                --1为导出(默认),0为导入
    @username sysname='',        --用户名,如果sql不允许使用NT验证方式登录,则必须指定
    @password sysname='',        --密码
    @code char(1)=N'N'           --文件编码,可以是n,c,N,W,作用参考bcp语法(如果是数据传输需要,建议用N)
    as
    declare @s nvarchar(4000)if isnull(@code,N'') not in(N'n',N'c',N'N',N'W')
    set @code='N'--备份文件名
    if isnull(@filename,N'')=N''
    begin
    select top 1 @filename=rtrim(reverse(filename)) 
    from master.dbo.sysfiles 
    where name=N'master'
    select @filename=stuff(@filename,1,charindex('\',@filename),N'')
    ,@filename=reverse(stuff(@filename,1,charindex('\',@filename),N''))
    +N'\BACKUP\'+db_name()+N'_[@tbname].txt'
    end
    else
    set @filename=replace(@filename,N'[@dbname]',db_name())declare tb cursor local
    for
    select N'bcp "'+db_name()
    +N'.'+quotename(user_name(uid))
    +N'.'+quotename(name)
    +N'"'
    +case when @isout=1 then N' out' else N' in' end
    +N' "'
    +replace(@filename,N'[@tbname]',name)
    +N'" /'+@code
    +case when isnull(@username,N'')=N'' then N' /T'
    else N' /U"'+@username
    +N'" /P"'+isnull(@password,N'')+N'"'
    end
    from sysobjects
    where xtype=N'U' and status>=0
    and(isnull(@tbname,N'')=''
    or charindex(','+name+',',','+@tbname+',')>0)
    open tb
    fetch tb into @s
    while @@fetch_status=0
    begin
    exec master..xp_cmdshell @s,no_output
    fetch tb into @s
    end
    close tb
    deallocate tb
    go
      

  3.   

    1楼的,没道理文件必须放到SERVER上才可以导数据啦。。不然怎么有远程访问这1说啊
      

  4.   

    2楼的 谢谢回复。
    你那个好像是导出吧。我这里是导入,通过bcp工具,从本机的txt文件导入到SERVER的DB中。本机可以导入本机上的txt,SERVER单独也可以导入SERVER上的Txt,
    可是就是郁闷不能从本机上的txt导入到Server的DB里救命啊~~~~~~~
      

  5.   

    文件是必须放在SERVER才能bcp的
    lz可以先xcopy自己本机的文件到sql服务器上在import
      

  6.   


    你的sql语句都是在服务器端执行的,但是你文件在本地,所以不能读取
      

  7.   

    各位:
    本问题已解决。。导入文件在本机上,DB在服务器上,是可以通过bcp工具导入的。我用bcp工具访问数据库时,-S参数写的是"服务器名\实例名",如下所示:
    Shell "bcp master.dbo.GG_DUNS in " & path_GG_DUNS.Text & " -S ICA0006\SQLEXPRESS -U sa -P qlzhang123 -c -t \t  -F 3 -e error.txt"本机txt导入本机DB无误,SERVER txt导入SERVER DB 也无误。但是这么设参,本机上的txt通过bcp访问SERVER时,则数据不能正常导入。把-S的参数"服务器名\实例名" ===〉修改成 IP 地址,就可以了。
    Shell "bcp master.dbo.GG_DUNS in " & path_GG_DUNS.Text & " -S 服务器的IP地址 -U sa -P qlzhang123 -c -t \t  -F 3 -e error.txt"
    至于原因,可能是因为远程访问,需要指定的是远程服务器的IP,
    不指定IP,只设置"服务器名\实例名",默认的是在本机的IP上寻找该服务器名,当然找不到了。:)
      

  8.   

    照楼主的办法,将-S 参数 改成ip 没法导入成功,只能将txt文件放到服务器。