ALTER PROCEDURE [dbo].[Get_Month]
 
 @city varchar(5000) --地市
AS
BEGIN  
 
SET NOCOUNT ON;
 
 
declare abc cursor for SELECT * FROM tab where city in(@city)  
 
谁知这个地市用IN应如何往里传参,我这样传:SP_Get_Month_116_T '北京,上海'不对呢,查不出数据这样可以查出来:select * from tab where city in('北京','上海')迷或了,这个参数要咋传进去呢?

解决方案 »

  1.   


    declare @sql nvarchar(max)
    set @sql='SELECT * FROM tab where city in('+@city+')'
    exec(@sql)如果你用游标的话,可以先创建一个表变量,然后insert into @temp exec(@sql)
    把数据存储在表变量中然后用于游标查询
      

  2.   

    ALTER PROCEDURE [dbo].[Get_Month]
     
     @city varchar(5000) --地市
    AS
    BEGIN  
     
    SET NOCOUNT ON;
     
     
    declare abc cursor for 
    SELECT * FROM tab where  (','+RTRIM(city)+',',','+@city+',')>0  
      

  3.   

    或用like/patindex用in时需要用动态字符串declare @sql nvarchar(2000)
    set @sql= 'declare abc cursor for SELECT * FROM tab where city in('+@city+')'
    exec(@sql)
     
      

  4.   


    无法在向表插入变量时将 EXECUTE 用作源。
      

  5.   


    我的是SQL2000,不支持这样的吧
      

  6.   

    额。。2000不能用insert into @temp exec(@sql)?
    那改成临时表呢insert into #temp exec(@sql)
      

  7.   

    好像只能用临时表吧#tabset @sql_y='insert into #tab SELECT CONVERT(varchar(7), 日期, 120)as 日期 FROM tab where city in('+@city+')
    exec(@sql_y)
    declare abc cursor select 日期 from #tab
    open abc
    现在是在关键字 'select' 附近有语法错误,游标也不能用临时表吗
      

  8.   

    declare abc cursor for select 日期 from #tab
    少了个关键字,然后我忘记告诉你了,拼接的sql里面的字符都要拼接单引号
    你写的应该改成这样
    set @sql_y='insert into #tab SELECT CONVERT(varchar(7), 日期, 120)as 日期 FROM tab where city in('''+replace(@city,',',''',''')+''')'
      

  9.   


    我传进来的@city 变量就是带引号的
    如:in ('北京','上海','南京')
    @city='北京','上海','南京'
      

  10.   

    执行报错,我应用几个引号呢?
    sp_exe_name '1',''北京','上海','南京''??
      

  11.   

    @city参数正常输入就行,里面用replace做了单引号的处理
    sp_exe_name '1','北京,上海,南京'
      

  12.   

    用动态sql 或者写函数把你输入字符串的按一定的标准(逗号)转成表。
      

  13.   


    ALTER Function [dbo].[GetSplitedValues](@Ids nvarchar(max))
    returns @Table Table(Id nvarchar(5000))
    As
    BeginDeclare @ind int
    Declare @Start intSet @Ids=@Ids+','
    Set @Start=1Set @ind =charindex(',',@Ids)
        While(@ind>0)
        Begin
            Declare @SubId nvarchar(100)
            Set @SubId=Substring(@Ids,@Start,(@ind-1))
            if(@SubId<>'' and @SubId Is Not Null)
            Begin
                insert into @Table(Id) values(@SubId)
           End
            Set @Ids =Substring(@Ids,@ind+1,Len(@Ids))
            SET @ind = charindex(',',@Ids ) 
        EndReturnEND
    ALTER PROCEDURE [dbo].[Get_Month]
     
     @city varchar(5000) --地市
    AS
    BEGIN  
     
    SET NOCOUNT ON;
     
     
     SELECT * FROM tab where city in (select * from GetSplitedValues( @city))
      

  14.   


    set @sql_y='insert into #tab SELECT CONVERT(varchar(7), 日期, 120)as 日期 FROM tab where city in('+@city+')
    exec(@sql_y)
    declare abc cursor select 日期 from #tab
    open abc这样执行过程后报错:对象名 '#tab' 无效。
      

  15.   


    insert into #tab
    这不就是创建临时表吗,我下面有执行exec(@sql_y)
      

  16.   

    这个只是向临时表插入数据,而不是创建,首先你要创建一个临时表,才能这样写if object_id(N'tempdb..#tab',N'U') is not null --判断临时表是否存在
    drop table #tab  --若存在就删除重新创建
    create table #tab
    (
    日期 varchar(7)
    )
    set @sql_y='SELECT CONVERT(varchar(7), 日期, 120)as 日期 FROM tab where city in('+@city+')'
    insert into #tab 
    exec(@sql_y)
    declare abc cursor select 日期 from #tab
    open abc--这是定义表变量的语句
    declare @tab table 
    (
    日期 varchar(7)
    )
    set @sql_y='SELECT CONVERT(varchar(7), 日期, 120)as 日期 FROM tab where city in('+@city+')'
    insert into @tab 
    exec(@sql_y)
    declare abc cursor select 日期 from @tab
    open abcinsert into是插入数据而不是创建
      

  17.   


    insert into #tab 这样也能创建临时表吧?我在最后也对这个表进行了删除 into不就是不存在自动创建吗?错了,应是select 。into #tab
      

  18.   

    是的。。select into是创建并填充数据,insert into单单只是填充数据
      

  19.   


    用select  into 好点,这样能少写不少语句,就是在最后在加一个删除临时表!谢谢你,结贴!