我们在平常编写sql语句时,经常碰到要把id列表字符串(比如:'001,002,003,....')当做参数传递给存储过程,

那么在存储过程中要用in作为条件进行记录的过滤,那么采用in(@idList),其中@idList如'001,002,003,....'。这样执行存储过程就会出错,显然这种传递方法是不可行的(除非@idList只有一个id如'001'),

今天晚上和导师尝试了很多中办法,还是没解决。在不断的讨论中,突然有个灵感:就是采用临时表,

把这些id一个一个存在临时表中(这个需要点技巧,后面给出代码),然后这样调用in:in(select id from #tbIdList)

,其中#tbIdList 为保存了id的临时表。

CREATE TABLE #tbUserId(userID int)
  DECLARE @userID varchar(20)
  WHILE(charindex(',',@Key) >0)
  BEGIN
  SET @userID = substring(@Key,0,charindex(',',@Key))
  SET @Key = substring(@Key,charindex(',',@Key)+1,len(@Key))
  INSERT INTO #tbUserId(userID) VALUES(@userID)
  END
   INSERT INTO #tbUserId(userID) VALUES(@Key)

例子:@Key='0001,0002,0003'

调用:SELECT * FROM tbUser WHERE userID IN (SELECT userID FROM #tbUserId)

 后来有同事问我效率怎样? 我去查了一下in的效率,发现建议使用exists不使用in,而上面的语句系统会自动转换为

Exists(Select * from #tbUserId where tbUser.userID  = userID),所以效率是没问题的。

可是如果IN后面查询语句涉及到多个条件且和外表相关时此时采用Exists效率更好。

http://www.cnblogs.com/zhangchenliang/archive/2010/01/10/1643584.html

posted @ 2013-07-19 08:17 kkyuanfen 阅读(1832) 评论(0) 推荐(0)
摘要: 1.1.1引用的添加添加引用后会在程序的bin目录下有一个Interop.Excel.dll文件,在应用程序页面添加引用的命名空间usingExcel;1.1.2模板的读写方法读模板的话,首先模板存放在某个路径下,根据模板把从数据库里取出的数据写回EXCEL然后生成一个新的EXCEL存放都另一个路径以供下载,模板不变。//建立一个Excel.Application的新进程Excel.Applicationapp=newExcel.Application();if(app==null){return;}app.Visible=false;app.UserControl=true;Workbook 阅读全文
posted @ 2013-05-25 23:06 kkyuanfen 阅读(178) 评论(0) 推荐(0)
点击右上角即可分享
微信分享提示