存储过程使用动态条件时,出现从" 数据类型 varchar 转换为 float 时出错"的问题

ahking 2011-10-10 04:41:39
存储过程如下:
ALTER PROCEDURE [dbo].[pp]
(
@Scope float =0.2,
@FilterCon int=0
)
AS
BEGIN
declare @strWhere varchar(500)
declare @strMain varchar(500)
if @FilterCon = 0
begin
set @strWhere = '....'
end
if @FilterCon = 1
begin
set @strWhere = ' ....'
end

set @strMAIN ='SELECT * FROM
(
SELECT
Code,
avgPrice = AVG(p1),
minPrice = MIN(p2),
LastDate = MAX(Date)
FROM Datab
GROUP BY Code
) A
INNER JOIN Datab B
ON A.Code = B.Code AND A.LastDate = B.Date
WHERE (A.avgPrice-B.p1) >= A.avgPrice*'+@Scope + @strWhere

exec(@strMAIN)

END

...全文
253 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
勿勿 2011-10-10
  • 打赏
  • 举报
回复
WHERE (A.avgPrice-B.p1) >= A.avgPrice*'+@Scope + @strWhere

=====》
ltrim(@Scope)

or

cast(@Scope as varchar(100))
-晴天 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ahking 的回复:]
这样感觉速度很慢,有没有替代的方法?
[/Quote]

最好不要用动态的,可以可以考虑不用 @where ,而是在不同 @FilterCon 时,执行三条不同的语句,这样,虽然写的内容长一些,但执行速度肯定要快.
--小F-- 2011-10-10
  • 打赏
  • 举报
回复
set @strMAIN ='SELECT * FROM
(
SELECT
Code,
avgPrice = AVG(p1),
minPrice = MIN(p2),
LastDate = MAX(Date)
FROM Datab
GROUP BY Code
) A
INNER JOIN Datab B
ON A.Code = B.Code AND A.LastDate = B.Date
WHERE (A.avgPrice-B.p1) >= A.avgPrice*'+ltrim(@Scope) + @strWhere
ahking 2011-10-10
  • 打赏
  • 举报
回复
这样感觉速度很慢,有没有替代的方法?
hao1hao2hao3 2011-10-10
  • 打赏
  • 举报
回复

WHERE (A.avgPrice-B.p1) >= CAST ( A.avgPrice * '+ @Scope + ' AS VARCHAR(20)) ' + @strWhere

中国风 2011-10-10
  • 打赏
  • 举报
回复
ALTER PROCEDURE [dbo].[pp]
(
@Scope float =0.2,
@FilterCon int=0
)
AS
BEGIN
declare @strWhere varchar(500)
declare @strMain varchar(500)
if @FilterCon = 0
begin
set @strWhere = '....'
end
if @FilterCon = 1
begin
set @strWhere = ' ....'
end

set @strMAIN ='SELECT * FROM
(
SELECT
Code,
avgPrice = AVG(p1),
minPrice = MIN(p2),
LastDate = MAX(Date)
FROM Datab
GROUP BY Code
) A
INNER JOIN Datab B
ON A.Code = B.Code AND A.LastDate = B.Date
WHERE (A.avgPrice-B.p1) >= A.avgPrice*'+CAST(@Scope AS VARCHAR(100)) + @strWhere

exec(@strMAIN)

END


CAST(@Scope AS VARCHAR(100))--改改
水族杰纶 2011-10-10
  • 打赏
  • 举报
回复
+@Scope 
--》
+ltrim(@Scope)
-晴天 2011-10-10
  • 打赏
  • 举报
回复
WHERE (A.avgPrice-B.p1) >= A.avgPrice*'+ltrim(@Scope) + @strWhere  

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧