我已利用如下方式将数据表中的数据 导出到c:\tab.xls文件中,
exec master..xp_cmdshell 'bcp "select * from NT..tab1 where datetime> '2010-10-27 13:26'" queryout c:\tab.xls -c -Usa -P123456' 但是不知道如何把表名,时间,导出文件作为参数传递过去??
试了几种方式都不行,还望大侠赐教!

解决方案 »

  1.   

    declare @sql varchar(1000)
    set @sql ='exec master..xp_cmdshell  ''bcp ' + 参数+..
    exec (@sql)
      

  2.   

    导出文件什么意思?
    你需要在excel里导出表名?时间,导出的文件名吗
      

  3.   

    导出: 指按查询条件,将查询的结果集复制到指定文件中针对不同的查询条件,希望把查询语句,比如 "select * from NT..tab1 where datetime> '2010-10-27 13:26'" 抽象出来,作为一个变量,
    但是变换了几种方式,尝试后仍然语法错误:(    --小笨
    期望大侠写完整些,多谢多谢~~
      

  4.   


    declare @s varchar(1000)
    set @s='select * from NT..tab1 where [datetime]>''2010-10-27 13:26'''set @s='
    exec master..xp_cmdshell ''BCP "'+@s+'" queryout c:\tab.xls -c -U sa -S 机器名\实例名 -P 123456' 
      

  5.   

    declare @s varchar(1000)
    declare @t datetime
    set @s='select * from NT..tab1 where '+@t'+>''2010-10-27 13:26'''set @s='
    exec master..xp_cmdshell ''BCP "'+@s+'" queryout c:\tab.xls -c -U sa -S 机器名\实例名 -P 123456'
      

  6.   

    declare @ii int
    declare @str varchar(1000)
    set @ii=5
    set @str='exec master..xp_cmdshell ''bcp "select * from teststudent..aaa where ii>'+str(@ii)+'" queryout c:\tab.xls -c -Usa -P123'''
    --print @str
    exec(@str)
      

  7.   

    --表名和列名都是变量
    declare @ii int
    declare @str varchar(1000)
    declare @tabName varchar(30)
    set @tabName='aaa'
    set @ii=5
    set @str='exec master..xp_cmdshell ''bcp "select * from teststudent..'+@tabName+' where ii>'+str(@ii)+'" queryout c:\tab.xls -c -Usa -P123'''
    --print @str
    exec(@str)
      

  8.   

    to sych888您提示的方式我试了,感觉应该是这个方向,但还是有语法错误:(
      

  9.   

    declare @str varchar(1000)
    declare @tabName varchar(30)
    declare @path varchar(30)
    declare @con varchar(50)set @tabName='users'
    set @con = '2010-12-12 20:02:04'
    set @path = 'c:\tab.txt'
    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' +@tabName+ '  " queryout '+ @path + ' -c -Usa -P123456'''
    exec(@str)上述方式能够正确导出数据了;
    但在where子句中加上时间条件后报错,下述方式仅增加了'where datetime> ' + @con +' 条件,还没发现哪里错了declare @str varchar(1000)
    declare @tabName varchar(30)
    declare @path varchar(30)
    declare @con varchar(50)set @tabName='users'
    set @con = '2010-12-12 20:02:04'
    set @path = 'c:\tab.txt'
    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' +@tabName+ 'where datetime> ' + @con +' " queryout '+ @path + ' -c -Usa -P123456'''
    exec(@str)提示的错误是:
    SQLState = 42000, NativeError = 102
    Error = [Microsoft][SQL Native Client][SQL Server]'>' 附近有语法错误。
    SQLState = 42000, NativeError = 8180
    Error = [Microsoft][SQL Native Client][SQL Server]未能准备语句。
    NULL
      

  10.   

    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' +@tabName+ 'where datetime> ''' + @con +''' " queryout '+ @path + ' -c -Usa -P123456'''
    exec(@str)
      

  11.   

    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' +@tabName+ 'where datetime> ' + @con +' " queryout '+ @path + ' -c -Usa -P123456'''
    改为
    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' +@tabName+ 'where datetime> ''' + @con +''' " queryout '+ @path + ' -c -Usa -P123456'''然后试试
      

  12.   

    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' +@tabName+ 'where datetime> ''' + @con +''' " queryout '+ @path + ' -c -Usa -P123456'''
    print @str 打印出来看看结果是什么
    exec(@str)
      

  13.   

    打印结果:
    exec master..xp_cmdshell 'bcp "select * from NTC..users where datetime> '2010-12-12 20:02:04' " queryout c:\tab.txt -c -Usa -P123456'奇怪,跟问题里的写法一样,问题里的语句也出现语法错误,---  之前的测试有误:(
    现在只要加上where条件就报错exec master..xp_cmdshell 'bcp "select * from NTC..tab1com11 " queryout c:\tab.txt -c -Usa -P123456'   ----OK直接在命令行采用下列方式也能正确导出
    bcp "select * from NTC..tab1com11 where datetime> '2010-12-12 20:02:04' " queryout c:\tab.txt -c -Usa -P123456
    麻烦大侠也在电脑上试下,我试试再更新
      

  14.   

    大家说的动态执行sql的方法都靠谱。 不错。 
      

  15.   

    发现这种用法中,字符串需要加两层引号,见B组
    A组:
    exec master..xp_cmdshell 'bcp "select * from NTC..tab1com11 where datetime> getdate()-365" queryout c:\tab.txt -c -Usa -P123456'
    exec master..xp_cmdshell 'bcp "select * from NTC..users where user_id = 1 " queryout c:\tab.xls -c -Usa -P123456' B组:
    exec master..xp_cmdshell 'bcp "select * from NTC..tab1com11 where datetime> ''2010-12-27 13:26:38.700'' " queryout c:\tab.txt -c -Usa -P123456'
    exec master..xp_cmdshell 'bcp "select * from NTC..tab1com11 where RECVDATA = ''7777'' " queryout c:\tab.txt -c -Usa -P123456'
    上述4组都测试正确。
      

  16.   

    declare @str varchar(1000)
    declare @tabName varchar(30)
    declare @path varchar(30)
    declare @con varchar(50)set @tabName='tab1com11'
    set @con = '2010-12-12 20:02:04'
    set @path = 'c:\tab.txt'
    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' + @tabName + ' where datetime> ''' + @con +''' " queryout '+ @path + ' -c -Usa -P123456'''
    print @str 
    exec(@str)
    上述@str的打印输出为:
    exec master..xp_cmdshell 'bcp "select * from NTC..tab1com11 where datetime> '2010-12-12 20:02:04' " queryout c:\tab.txt -c -Usa -P123456'
    那按照两层引号的结论,再加一层引号,也就是给@con加引号了
    set @con = ‘'2010-12-12 20:02:04'’所有语句为:
    declare @str varchar(1000)
    declare @tabName varchar(30)
    declare @path varchar(30)
    declare @con varchar(50)set @tabName='tab1com11'
    set @con = '''2010-12-12 20:02:04'''
    set @path = 'c:\tab.txt'
    set @str='exec master..xp_cmdshell ''bcp "select * from NTC..' + @tabName + ' where datetime> ''' + @con +'''" queryout '+ @path + ' -c -Usa -P123456'''
    print @str 
    exec(@str)

    打印输出为:
    exec master..xp_cmdshell 'bcp "select * from NTC..tab1com11 where datetime> ''2010-12-12 20:02:04''" queryout c:\tab.txt -c -Usa -P123456'
    此时也得到正确结果了。不过,没有搞明白这些括号是怎么匹配的,怎么只需多一层括号,@con条件里却需要多两层括号???