日期:2014-05-18  浏览次数:20436 次

最后70分,全拿出来了,如要解决了,另外几个相关帖分一并送,郁闷!
一个存储过程:

CREATE   proc   xxxx
(
@companyname   varchar(1000)=null--这里不知道要如何改,改成什么类型的
)
as
begin

select   公司id,gsid,公司名称,sum(金额)   as   用款总额   from  
(
                                      select   *   from   a
                                      union   all
                                      select   *   from   b
)   t  
where   审批意见= '同意 '
and   gsid   in   (case   when   @companyname   is   null   then   gsid   else   @companyname   end)
group   by   公司id,gsid,公司名称   order   by   公司id

end
GO

我想实现@companyname这个输入参数可以直接支持如这样的123,56,554(数量不定,数值是gsid字段值)或是123这样单个gsid
如果@companyname采用varchar类型,则输入数据后会提示:
将   varchar   值   ' '357,650 ' '   转换为数据类型为   int   的列时发生语法错误。

改成int更不用提了,网上查了很多资料,但是搞了半天也不知道要如何套进我的语句中去
前台ASP查询数据库得出的gsid   in   (这里的值是123,545,8如此类的数据),通过调用这个存储过程取得数据,请高手帮忙改一下吧,急用,再拿不出来,就要挨K了解


------解决方案--------------------
CREATE PROC xxxx
(@companyname VARCHAR(1000)=null)
AS
BEGIN
SELECT 公司id,gsid,公司名称,SUM(金额) AS 用款总额
FROM
(SELECT * FROM a
UNION ALL
SELECT * FROM b) t
WHERE 审批意见= '同意 '
AND (CHARINDEX( ', '+CONVERT(NVARCHAR(20),gsid)+ ', ', ', '+@companyname+ ', ')> 0 OR @companyname IS NULL)
GROUP BY 公司id,gsid,公司名称
ORDER BY 公司id
END
GO

SELECT CHARINDEX( 'a ', 'ba ')
------解决方案--------------------
--try

CREATE proc xxxx
(
@companyname varchar(1000)=null--这里不知道要如何改,改成什么类型的
)
as
begin

declare @sql varchar(8000)
set @sql= '
select 公司id,gsid,公司名称,sum(金额) as 用款总额 from
(
select * from a
union all
select * from b
) t
where 审批意见= ' '同意 ' '
'

if @companyname is not null
set @sql=@sql+ ' and gsid in( '+@companyname+ ') '


set @sql=@sql+ ' group by 公司id,gsid,公司名称 order by 公司id '

exec(@sql)
end
GO