master..xp_cmdshell 'bcp "select * from table where a = '123456' or a='5456' or a='1566' or a='782'" queryout d:\aa.txt -c -S 192.168.0.1 -U sa -P sa以上语句可以正常导出记录集,但是当select语句很长时(假设后面有10000条or语句),则bcp就不能正常工作了,提示varchar的参数不对,我估计是不已经超过了varchar的最大值8000了,但是我的sql语句必须这样写的很长,请问各位大侠,应该如何解决这个问题?

解决方案 »

  1.   

    你的意思是把select语句建立成为视图?
    我的select语句每时每刻都是动态生成的,查询量很大,怎么建立视图?
      

  2.   

    建临时视图,用完后删除
    create view....
      

  3.   

    hccl(jackie) ( ) 信誉:100    Blog  2006-12-19 12:13:31  得分: 0  
     
     
       你的意思是把select语句建立成为视图?
    我的select语句每时每刻都是动态生成的,查询量很大,怎么建立视图?
      
     
    使用openrowset方式把动态语句的结果建为视图
      

  4.   

    楼上的能否,根据我的SQL语句写一个示例看看,谢谢
      

  5.   

    比如,将你动态语句的那部分查询写成一个存储过程 p然后 create view即可.我随便写个例子:
    USE tmp
    CREATE PROC P
    AS
     BEGIN
       SELECT 1 ID
     ENDCREATE VIEW v
    AS 
     SELECT * FROM  OPENROWSET('SQLOLEDB','(local)';'sa';'password','EXEC tmp.dbo.p') a
    这样就可以了
      

  6.   

    在前台把select语句建立好,直接create view,用完drop就可以了
      

  7.   

    TO fcuandy(手中无剑,心中亦无):
    存储过程的参数好像没用办法接收大于varchar(8000)的字符,我的动态语句远远大于这个值
    请指教
      

  8.   

    jacobsan(梅) :你的方法,我试过了,成功执行,谢谢你,但是效率不是很高,我会给你加分的
      

  9.   

    把它写成存储过程 然后BCP调用存储过程不就行了 简单的事情 别复杂化了 下面是调用例子
    -------------------------------------------------------------------------------
    master..xp_cmdshell 'bcp  "exec [库名].dbo.data_statistics ''2005-5-1'',''2006-10-31''" queryout "d:\ff.xls"  -c -q -U"sa" -P"654321"'
      

  10.   

    建立一个临时表, 把or后面的都查到临时表里面:
    create #t(a varchar(255))insert #t ..1
    insert #t ..2
    insert #t ..3
    ...
    insert #t ..n然后join一下:
    master..xp_cmdshell 'bcp "select * from table, #t where #t.a = table.a" queryout d:\aa.txt -c -S 192.168.0.1 -U sa -P sa
      

  11.   

    楼上的思路是个做法.不过用临时表可行吗? 我没试过采用 xp_cmdshell运行bcp之后执行查询时是不是跟原语句在一个会话中.不过理论上应该是两个不同的会话,所以局部临时表不可用,可以用个实表代替.我前面的回贴仅针对于你所提的"如何将动态语句结果存为视图"
      

  12.   

    你这样写这么多or是不好的你可以把 '123456' '5456' '1566' '782'存到一张表里,比如说表aaa字段为b,然后查询的时候
    用master..xp_cmdshell 'bcp "select * from table where a in (select b from aaa)" queryout d:\aa.txt -c -S 192.168.0.1 -U sa -P sa你说你的条件是每次都变的,那也容易,每次做这个操作之前先用truncate table清空表,再把条件插入即可
      

  13.   

    请教:fcuandy
    那如何改善用or连接的效率问题,有么更好的可行办法?
      

  14.   

    也差不了多少.
    用 charindex可以让你的语句稍变短一点.
    也可以将or 改为 内连接的方式.
      

  15.   

    我看过一篇文章,用的是单独的查询来取代or,速度也比or快。大概是这样,你不妨试试。
      

  16.   

    补充具体做法比如要获取数目,原来的where条件里面有个or。修改是这样,分成若干select语句,每个where里一个=条件。最后把各个select结果加起来。
      

  17.   

    写到存储过程里,在进行bcp调用就行了!
      

  18.   

    其实上万条的union all和or语句效率也不会相差很多了,感谢大家如此踊跃!
      

  19.   

    难道不能用in吗?where a in ('1234','3456','333')这样效率高,而且字符串短。不过话说回来,拼接几万条字段组成sql语句的做法,恐怕不是什么好主意。
      

  20.   

    先在sql server中把数据整理好,做成一个表或者视图再输出。
      

  21.   

    TO dingyin(这个那个) :
    用in关键字确实收到了很好的效果,谢谢
      

  22.   

    1st suggestion: why no using keyword in() phrase
    2nd one:It will be fine in SQL2005
    3rd :i think if u create a view for temp using it's a good way
    For ur reference
      

  23.   

    我是菜鸟,请问你什么SQL语句长度超过10000?基于哪个行业的系统?小弟想了解一下...