用到sql链接服务器额一定对openquery不陌生,,在openquery中不能用变量参数来进行动态查询,,但是仍然可以 将where条件置于openquery体外进行判断例如
select * from openquery(
[连接服务器],'sql语句'
)
where .....
一开始使用没有明白其使用方法只是生搬硬套,直到遇见数据量很大的时候才发现硬套不行了,需要研究一下;
其实在这个openquery中相当于一个子查询的结果集,外边的一层使根据里面子查询 查到的内容进行二次筛选,,也就是相当于
select * from (select * from tables) as a ,这种格式,速度快慢取绝于你在子查询中查到可用记录的条数(也就是在满足条件的前提下,子查询数据量越小越好),
举个例子,如果你在有一亿条数据的记录中用链接服务器做增量插入到另外一个数据库中的话,这里就必须要设置一个合理的时间条件范围,不能把所有的where条件都放在最外层的查询当中,否则就完蛋了,
这时我们可以在子查询中先规定一个时间范围,时间可用CONVERT 函数来进行动态条件查询将范围进一步动态缩小(这里就可以做成无人值守的作业了)
总而言之 不能把所有的条件都放置到外层的查询中 ,子查询 记录数量在够用的情况下一定要少!
INSERT INTO u_sale_c (saleno,rowid,busno,accdate,wareid,makeno,wareqty,lsj,lsze,netprice,sshje,chbje,saler,member,acctime,yhje,integralvalue) SELECT * FROM openquery ([192.9.200.108], ' SELECT scd , rcdidx , dptid , substring (trddtm, 1, 8) as trddtm , gdsid , bthno , qty , rtlprc , rtlprc * qty , round (sttamt / qty, 4) , sttamt , (SELECT round (AVG (amt * (1 + taxrto)), 4) FROM scst WHERE srcbllno = salrcd.scd AND gdsid = salrcd.gdsid AND savdptid = salrcd.dptid ) as price , (SELECT gdr FROM gdrdtl WHERE scd = salrcd.scd AND rcdidx = salrcd.rcdidx) as gdr , (SELECT mbrid FROM trdrcd WHERE scd = salrcd.scd ) as mbrid , convert (DATETIME, substring (trddtm, 1, 4) + ''-'' + substring (trddtm, 5, 2) + ''-'' + substring (trddtm, 7, 2) + '' '' + substring (trddtm, 9, 2) + '':'' + substring (trddtm, 11, 2) + '':'' + substring (trddtm, 13, 2)) as trddtmtime , round ((rtlprc * qty - sttamt), 2) as yhje , points FROM [yyshop].[dbo].[salrcd] salrcd where trddtm>= CONVERT (VARCHAR (8), DATEADD (dd, -3, GETDATE ()), 112) + ''000000'' ') WHERE rcdidx NOT IN (SELECT rowid FROM u_sale_c WHERE saleno = scd COLLATE Chinese_PRC_CS_AS_KS_WS AND accdate >= CONVERT (VARCHAR (8), DATEADD (dd, -3, GETDATE ()), 112))