当前位置: 代码迷 >> Sql Server >> 存储过程执行报错,
  详细解决方案

存储过程执行报错,

热度:41   发布时间:2016-04-24 09:57:24.0
存储过程执行报错,求救啊。
代码如下:
create procedure khrepotr(@v_startdate datetime,@v_enddate datetime,@v_deptname varchar,@v_AssessmentTemplate varchar)
as
declare @sql nvarchar(4000)
begin
set @sql = 'select a.deptName,a.OutsourcingName,a.AssessmentTemplate '
select @sql = @sql + ' , max(case assessmentitem when ''' + assessmentitem + ''' then b.realrecord end) [' + assessmentitem + ']'
from (select distinct b.assessmentitem 
from tb_cttsp_daiwCompanyConsequence a , tb_cttsp_daiwCompanyRelation b
where a.id=b.parentId) as a
set @sql = @sql + ',a.total from tb_cttsp_daiwCompanyConsequence a , tb_cttsp_daiwCompanyRelation b
where a.id=b.parentId 
and a.AssessmentDate between @v_startdate 
and @v_enddate and a.deptName=@v_deptname 
and a.AssessmentTemplate=@v_AssessmentTemplate
group by a.deptName,a.OutsourcingName,a.AssessmentTemplate,a.total'
EXEC sp_executesql @sql,N'@v_startdate datetime',@v_startdate,N'@v_enddate datetime',@v_enddate,N'@v_deptname varchar',@v_deptname,N'@v_AssessmentTemplate varchar',@v_AssessmentTemplate
end

执行
exec khrepotr @v_startdate='2014-01-01',@v_enddate='2014-10-01',@v_deptname='中国铁通广州分公司',@v_AssessmentTemplate='A类集客家宽'

执行提示错误,求解。
消息 137,级别 15,状态 2,第 4 行
必须声明标量变量 "@v_enddate"。

------解决思路----------------------
先不说别的,红字部分就容易出问题,不加括号的值默认只有1,不够存放
CREATE PROCEDURE khrepotr
    (
      @v_startdate DATETIME ,
      @v_enddate DATETIME ,
      @v_deptname VARCHAR(10) ,
      @v_AssessmentTemplate VARCHAR(10)

    )
AS
    DECLARE @sql NVARCHAR(4000)
    BEGIN
        SET @sql = 'select a.deptName,a.OutsourcingName,a.AssessmentTemplate '
        SELECT  @sql = @sql + ' , max(case assessmentitem when '''
                + assessmentitem + ''' then b.realrecord end) ['
                + assessmentitem + ']'
        FROM    ( SELECT DISTINCT
                            b.assessmentitem
                  FROM      tb_cttsp_daiwCompanyConsequence a ,
                            tb_cttsp_daiwCompanyRelation b
                  WHERE     a.id = b.parentId
                ) AS a
        SET @sql = @sql
            + ',a.total from tb_cttsp_daiwCompanyConsequence a , tb_cttsp_daiwCompanyRelation b
where a.id=b.parentId 
and a.AssessmentDate between @v_startdate 
and @v_enddate and a.deptName=@v_deptname 
and a.AssessmentTemplate=@v_AssessmentTemplate
group by a.deptName,a.OutsourcingName,a.AssessmentTemplate,a.total'
        EXEC sp_executesql @sql, N'@v_startdate datetime', @v_startdate,
            N'@v_enddate datetime', @v_enddate, N'@v_deptname varchar',
            @v_deptname, N'@v_AssessmentTemplate varchar',
            @v_AssessmentTemplate
    END
------解决思路----------------------
sp_executesql 不是这么玩的哦。
EXEC sp_executesql @sql, 
N'@v_startdate datetime ,@v_enddate datetime,@v_deptname varchar(max),@v_AssessmentTemplate varchar'(max)', @v_startdate, @v_enddate,   @v_deptname,  @v_AssessmentTemplate

------解决思路----------------------
引用:
sp_executesql 不是这么玩的哦。
EXEC sp_executesql @sql, 
N'@v_startdate datetime ,@v_enddate datetime,@v_deptname varchar(max),@v_AssessmentTemplate varchar'(max)', @v_startdate, @v_enddate,   @v_deptname,  @v_AssessmentTemplate
  相关解决方案