SqlServer 中存储过程:money类型与char类型的转换问题

ALTERPROCEDURE[dbo].[SearchMerchandise]@Categoryvarchar(50),@Brandvarchar(50),@Typeva... ALTER PROCEDURE [dbo].[SearchMerchandise]
@Category varchar(50),
@Brand varchar(50),
@Type varchar(50),
@FormerPrice money,
@LatterPrice money
AS
declare @QueryString varchar(100)
set @QueryString='select * from Merchandise where Category=@Category and Brand=@Brand '
BEGIN

SET NOCOUNT ON;

if @Type<>''
set @QueryString=@QueryString+' and Type='+''''+@Type+''''+' and '
if @FormerPrice<>'' and @LatterPrice<>''
set @QueryString=@QueryString+'PriceNow bettwwen'+''''+@FormerPrice+''''+' and '+''''+@LatterPrice+''''+' and '
if @FormerPrice<>'' and @LatterPrice=''
set @QueryString=@QueryString+'PriceNow >='+''''+@FormerPrice+''''+' and '
if @FormerPrice='' and @LatterPrice<>''
set @QueryString=@QueryString+'PriceNow <='+''''+@LatterPrice+''''+' and '
set @QueryString=@QueryString+'1=1'
exec(@QueryString)
END
其中有一句是if @Type<>''
set @QueryString=@QueryString+' and Type='+''''+@Type+''''+' and '
我不明白为什么+@Type+外面要四个单引号。。。
第二个问题就是if @FormerPrice<>'' and @LatterPrice<>''
set @QueryString=@QueryString+'PriceNow bettwwen'+''''+@FormerPrice+''''+' and '+''''+@LatterPrice+''''+' and ' 这句话中还是那几个单引号的问题,貌似这几个单引号把里面的内容转换成了char类型了,但是@FormerPrice和@LatterPrice是money类型,所有执行该存储过程中出错。错误信息为:消息 235,级别 16,状态 0,过程 SearchMerchandise,第 18 行
无法将 char 值转换为 money。该 char 值的语法有误。
执行的代码为:
USE [OfficialBusiness]
GO

DECLARE @return_value int

EXEC @return_value = [dbo].[SearchMerchandise]
@Category = N'笔记本类',
@Brand = N'神州',
@Type = NULL,
@FormerPrice = 2000,
@LatterPrice = 3000

SELECT 'Return Value' = @return_value

GO

希望高手尽快给予答复,答案满意者定追加分。。。谢谢啦
between 我打错了 继续求解。。。在线等。。
这是表:CREATE TABLE [dbo].[Merchandise](
[MerchandiseID] [int] IDENTITY(1,1) NOT NULL,
[Category] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Brand] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Type] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[PriceNow] [money] NOT NULL,
GO
展开
 我来答
shenchaoliang
推荐于2016-06-17 · TA获得超过1163个赞
知道大有可为答主
回答量:810
采纳率:0%
帮助的人:1519万
展开全部
自己写的么?
1有些地方没必要4个单引号,3个就行,在sql中字符串的拼接语句中要表示1个单引号就得用两个单引号,前一个表示转义的意思,编程语言都有转义一说
2因为是字符串拼接的,而@FormerPrice这些是money类型的,如果不转换,就默认要把字符串转换成money类型了,就会出错。所以得把@FormerPrice之类的转换成字符类型的,存储过程修改如下
ALTER PROCEDURE [dbo].[SearchMerchandise]
@Category varchar(50),
@Brand varchar(50),
@Type varchar(50),
@FormerPrice money,
@LatterPrice money
AS
BEGIN
declare @QueryString varchar(100)
set @QueryString = 'select * from Merchandise where Category = ''' + @Category + ''' and Brand = ''' + @Brand + ''' '
SET NOCOUNT ON;

if @Type<>''
set @QueryString = @QueryString+' and Type=''' +@Type+ ''''
if @FormerPrice<>'' and @LatterPrice<>''
set @QueryString = @QueryString+' and PriceNow between '''+ convert(varchar(20),@FormerPrice) + ''' and ''' + convert(varchar(20),@LatterPrice) + ''''
if @FormerPrice<>'' and @LatterPrice=''
set @QueryString = @QueryString+' and PriceNow >=''' + convert(varchar(20),@FormerPrice) + ''''
if @FormerPrice='' and @LatterPrice<>''
set @QueryString = @QueryString+' and PriceNow <=''' + convert(varchar(20),@LatterPrice) + ''''

exec(@QueryString)
END
因为没有表结果不能进行测试,所以可能会出错,如果出错就把表结果发一下,进行测试
更多追问追答
追问
你的答案报错了 内容为:消息 105,级别 15,状态 1,第 1 行
字符串 '2000' 后的引号不完整。
消息 102,级别 15,状态 1,第 1 行
'2000' 附近有语法错误。 其中的2000是FormerPrice的值
追答
declare @QueryString varchar(100) 这出错了,没注意你原来定义的长度,太短,拼接超100字符了。改成8000
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式