存储过程中有一参数@no,其值是 '001’,'002' 的形式。而存储过程的查询大概是这样:
select * from Tab where No in ('001','002') 
试过select * from Tab where No in (@no),不可行。
现在使用把SQL语句写成字符串@sql,然后是exec(@sql) 。
请问使用这种方法是否比在存储过程直接使用SQL语句查询的慢?如果想要直接查询 select * from Tab where No in ,in后面怎么写?

解决方案 »

  1.   

    差不多吧,
    你要不就使用sp_executesql
    declare @sql nvarchar(2000),@no nvarchar(200)
    select @sql =' select * from Tab where No in ( ' ,@no ='''001'',''002'''
    select @sql = @sql +@no + ')' 
    exec sp_executesql @sql
      

  2.   

    sp_executesql  和exec 有什么差别?问题是查询语句要关联很多表,查询起来非常慢,而且已经差不多有8000 个字符(当@no 很长的时候就超8000字符)。能直接写查询语句而不用exec(@sql) 的方式吗 
      

  3.   

    sp_executesql 
    -----------
    这个可以重用执行计划,
    应该来说多次执行要快点~
      

  4.   

    sp_executesql 后面是接nvarchar的SQL语句,而nvarchar最多是4000字符,我的SQL语句超过4000字符
      

  5.   

    你是SQL 2000?
    那就貌似没有什么好的方式了..
      

  6.   

    直接使用SQL查询的话 应该会比使用存储过程慢应为存储过程在创建的时间已经 经过了编译的过程 并且查询分析器已经选择了最优化的一种方式执行 
    但是 直接SQL语句还需要经过这些步骤 
    显然存储过程花费的时间要短建议使用存储过程实现
      

  7.   

    declare @s varchar(8000)
    set @s='001,002'
    select * from Tab 
    where charindex(','+ltrim(No)+',',','+@s+',')>0 
      

  8.   


    if object_id('Tab') is not null
       drop table Tab
    go
    create table Tab
    ( No int,
      姓名 nvarchar(10)
    )
    insert into Tab select 001,'张三'
         union all  select 002,'李四'
    go
    declare @No nvarchar(3)
    set @No=001
    select * from Tab where No in ('001','002') 
    select * from Tab where No in (@no)
      

  9.   


    if object_id('Tab') is not null
       drop table Tab
    go
    create table Tab
    ( No nvarchar(6),
      姓名 nvarchar(10)
    )
    insert into Tab select 001,'张三'
         union all  select 002,'李四'
    go
    declare @sql nvarchar(100),@No nvarchar(10)
    set @sql='select *from Tab where No in('
    set @No='001,002'
    select * from Tab where No in (001,002) 
    set @sql=@sql+@no +')'
    exec sp_executesql @sql 
      

  10.   

    select px=identity(int,1,1) into # from sysobjectsdeclare @No nvarchar(8)
    set @No='张三,李四'select tab.* from Tab ,#
    where charindex((tab.姓名),@No)=#.px