日期:2014-05-17  浏览次数:20550 次

存储过程用in传参数问题??
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('北京','上海')

迷或了,这个参数要咋传进去呢?

------解决方案--------------------

declare @sql nvarchar(max)
set @sql='SELECT * FROM tab where city in('+@city+')'
exec(@sql)

如果你用游标的话,可以先创建一个表变量,然后insert into @temp exec(@sql)
把数据存储在表变量中然后用于游标查询
------解决方案--------------------
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,',',''',''')+''')'
------解决方案--------------------



ALTER Function [dbo].[GetSplitedValues](@Ids nvarchar(max))
returns @Table Table(Id nvarchar(5000))
As
Begin

Declare @ind int
Declare @Start int

Set @Ids=@Ids+','
Set @Start=1

Set @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 ) 
    End

Return

END



ALTER PROCEDURE [dbo].[Get_Month]
 
 @city varchar(5000) --地市
AS
BEGIN  
 
SET NOCOUNT ON;
 
 
 SELECT * FROM tab where city in (select * from GetSplitedValues( @city))

------解决方案--------------------
这个只是向临时表插入数据,而不是创建,首先你要创建一个临时表,才能这样写

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)