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

请教一个sql拼接搜索问题~
ALTER PROCEDURE [dbo].[Tb_AdvancedSearch]
(
@fld_GoodsClassId int,
@fld_StartLevel nvarchar(50),
@fld_DistrictId int,
@fld_CreatedTime datetime
)
AS
begin
 declare @sql nvarchar(1000) --生成的sql语句
 
  if @fld_DistrictId = 0
    begin
    set @sql = 'select b.*,
c.fld_UserName as fld_UserName,
d.fld_DistrictName as fld_DistrictName,
e.fld_GoodsClassName as fld_GoodsClassName,

FROM Tb_Goods as b inner join Tb_User as c on b.fld_UserId = c.fld_UserId
inner join Tb_District as d on b.fld_DistrictId = d.fld_DistrictId
inner join Tb_GoodsClass as e on b.fld_GoodsClassId = e.fld_GoodsClassId 
WHERE b.fld_GoodsClassId = ''' +  cast(@fld_GoodsClassId  as varchar(10)) + ''' and fld_StartLevel = ''' + @fld_StartLevel + ''' and fld_CreatedTime >= ''' + cast(@fld_CreatedTime as varchar) 

exec sp_executesql @sql
end
else
    begin
    set @sql = 'select b.*,
c.fld_UserName as fld_UserName,
d.fld_DistrictName as fld_DistrictName,
e.fld_GoodsClassName as fld_GoodsClassName,

FROM Tb_Goods as b inner join Tb_User as c on b.fld_UserId = c.fld_UserId
inner join Tb_District as d on b.fld_DistrictId = d.fld_DistrictId
inner join Tb_GoodsClass as e on b.fld_GoodsClassId = e.fld_GoodsClassId 
WHERE b.fld_GoodsClassId = ''' + cast(@fld_GoodsClassId  as varchar(10)) + ''' and fld_StartLevel = ''' + @fld_StartLevel + ''' and fld_CreatedTime >= ''' +cast(@fld_CreatedTime as varchar) + ''' and fld_DistrictId = ''' + cast(@fld_DistrictId as varchar)
exec sp_executesql @sql
end
end


原意是想根据 @fld_StartLevel @fld_DistrictId @fld_CreatedTime的值,来显示搜索结果。
但每次执行的结果都是

正在运行 [dbo].[Tb_AdvancedSearch] ( @fld_GoodsClassId = 2, @fld_StartLevel = 2, @fld_DistrictId = 0, @fld_CreatedTime = 2013-4-12 ).
字符串 '04 12 2013 12:00AM' 后的引号不完整。
'04 12 2013 12:00AM' 附近有语法错误。
没有行受影响。
(返回 0 行)
@RETURN_VALUE = 0
完成 [dbo].[Tb_AdvancedSearch] 运行。

我要怎么修改这存储过程?还是有更好的方法可以代替?
SQL 搜索

------解决方案--------------------
declare @sql nvarchar(1000)这句加长一点,1000太短了,搞成4000还差不多,另外日期应该转换一下,不然04 12 2013 12:00AM也收不到你要的结果:

<