存储过程中 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包含起来.