首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

存储过程中 SQL字符串拼接有关问题

2012-03-09 
存储过程中 SQL字符串拼接问题CREATEPROCEDURET_ZzSwl--/组装实物量_生产@b_datedatetimenull,@e_datedat

存储过程中 SQL字符串拼接问题
CREATE   PROCEDURE     T_ZzSwl                                     --/组装实物量_生产
@b_date   datetime=null,
@e_date   datetime=null,
@bc   nvarchar(2)=null,
@Ry   nvarchar(10)=null

AS
begin
set   nocount   on
DECLARE   @sql   varchar(8000)--/sql语句
DECLARE   @BD   varchar(4000)--/开始日期
DECLARE   @ED   varchar(4000)--/结束日期
DECLARE   @BED   varchar(4000)--/开始日期+结束日期

DECLARE   @BDT   varchar(4000)--/开始日期
DECLARE   @EDT   varchar(4000)--/结束日期
DECLARE   @BEDT   varchar(4000)--/开始日期+结束日期


DECLARE   @STJ   varchar(4000)--/开始条件
DECLARE   @ZTJ   varchar(4000)--/中间条件


set   @bc=ltrim(rtrim(@bc))
set   @Ry=ltrim(rtrim(@Ry))

SET   @BD= '   AND   日期   =   ' ' '+convert(varchar(10),@b_date,120)+ ' ' ' '--/开始日期
SET   @ED= '   AND   日期   =   ' ' '+convert(varchar(10),@e_date,120)+ ' ' ' '--/结束日期
SET   @BED= '   AND   日期   between   ' ' '+convert(varchar(10),@b_date,120)+ ' ' '   and   ' ' '+convert(varchar(10),@e_date,120)+ ' ' ' '--/开始+结束日期(sql字符串   开使用)

SET   @BDT= '   OR   日期   =   ' ' '+convert(varchar(10),@b_date,120)+ ' ' ' '--/开始日期
SET   @EDT= '   OR   日期   =   ' ' '+convert(varchar(10),@e_date,120)+ ' ' ' '--/结束日期
SET   @BEDT= '   OR   日期   between   ' ' '+convert(varchar(10),@b_date,120)+ ' ' '   and   ' ' '+convert(varchar(10),@e_date,120)+ ' ' ' '--/开始+结束日期(sql字符串   中间用)


SET   @STJ= '   '
SET   @ZTJ= '   '

SET   @sql= 'SELECT   日期,班次,组长,人员1,人员2,人员3,人员4,学徒   from   表1   where   1=1 '

IF   @b_date   IS   NOT   NULL
SET   @STJ=@BD
SET   @ZTJ=@BDT

IF   @b_date   IS   NULL
SET   @STJ=@ED
SET   @ZTJ=@EDT


IF   @b_date   IS   NOT   NULL   AND   @e_date   IS   NOT   NULL
SET   @STJ=@BED
SET   @ZTJ=@BEDN


IF   @bc   IS   NOT   NULL
SET   @STJ=@STJ+ '   AND   班次   =   ' ' '+@bc+ ' ' ' '
SET   @ZTJ=@ZTJ+ '   AND   班次   =   ' ' '+@bc+ ' ' ' '


IF   @Ry   IS   NOT   NULL
--/问题出在下面这句****************
SET   @sql=@sql+@STJ+ '   AND   组长   =   ' ' '+@Ry+ ' ' ' '+@ZTJ+ '   AND   姓名1   =   ' ' '+@Ry+ ' ' ' '+@ZTJ+ '   AND   姓名2   =   ' ' '+@Ry+ ' ' ' '+@ZTJ+ '   AND   姓名3   =   ' ' '+@Ry+ ' ' ' '+@ZTJ+ '   AND   姓名4   =   ' ' '+@Ry+ ' ' ' '+@ZTJ+ '   AND   学徒   =   ' ' '+@Ry+ ' ' ' '+ 'order   by   日期,班次 '
--如果把   @ZTJ   换成   '   OR   日期   between   ' ' '+convert(varchar(10),@b_date,120)+ ' ' '   and   ' ' '+convert(varchar(10),@e_date,120)+ ' ' ' '   则可以执行   用变量则返回代码=0  


--/   查询分析器里   输入@b_date   @e_date   @Ry
--/如果改成这样   SET   @sql=@sql+@STJ+ '   AND   组长   =   ' ' '+@Ry+ ' ' ' '   也可以执行加了变量   @ZTJ后就返回0了

IF   @Ry   IS   NULL   AND   @b_date   IS   NOT   NULL   OR     @Ry   IS   NULL   AND   @e_date   IS   NOT   NULL   OR     @Ry   IS   NULL   AND   @bc   IS   NOT   NULL   OR     @Ry   IS   NULL   AND   @cpname   IS   NOT   NULL   OR     @Ry   IS   NULL   AND   @cpph   IS   NOT   NULL

SET   @sql=@sql+@STJ+ 'order   by   日期,班次 '

--SET   @sql=@sql+ 'order   by   日期,班次 '

EXEC(@sql)
set   nocount   off  
end
GO


[解决办法]
出错了么?
[解决办法]
将变量放入字符串显然会有问题
[解决办法]
看错。。
应该没问题啊,将语句print出来单独运行试试看?
[解决办法]
查看print @sql的结果
[解决办法]
print @sql

没看到语句??
[解决办法]
CREATE PROCEDURE T_ZzSwl --/组装实物量_生产
@b_date datetime=null,
@e_date datetime=null,
@bc nvarchar(2)=null,
@Ry nvarchar(10)=null
AS
BEGIN
SET NOCOUNT ON

SET @bc=LTRIM(RTRIM(@bc))
SET @Ry=LTRIM(RTRIM(@Ry))

SELECT 日期,班次,组长,人员1,人员2,人员3,人员4,学徒
FROM 表1
WHERE 1=1
AND (DATEDIFF(day,@b_date,日期)> =0 OR @b_date IS NULL)
AND (DATEDIFF(day,日期,@e_date)> =0 OR @e_date IS NULL)
AND (班次=@BC OR @bc IS NULL)
AND (姓名1=@Ry OR 姓名2=@Ry OR 姓名3=@Ry OR 姓名4=@Ry OR 学徒=@Ry OR @Ry IS NULL)
ORDER BY 日期,班次

SET NOCOUNT OFF
END
[解决办法]
如果是因为Where条件而使用动态SQL,一般都可以转化为不用动态SQL的方式.
[解决办法]
IF的作用域不对,把希望IF控制的作用域用Begin...End包含起来.

热点排行
Bad Request.