SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GOALTER  PROCEDURE [dbo].[GetSpecifiedEmpDuty]
(
@EmpId INT,
@DutyDate DATETIME
)
AS
DECLARE @sql nvarchar(2000),
   @FirstDayOfThisMonth DATETIME,  
   @LastDayOfThisMonth DATETIME,
   @common VARCHAR(10),
   @late VARCHAR(10),
   @affair VARCHAR(10),
   @sick VARCHAR(10),
   @married VARCHAR(10),
   @funeral VARCHAR(10),
   @pregnancy VARCHAR(10),
   @holiday VARCHAR(10),
   @allRest VARCHAR(10),
   @allDay VARCHAR(10),
   @halfDay VARCHAR(10)
BEGIN
SET @common = '正常上班'
SET @late = '迟到'
SET @affair = '事假'
SET @sick = '病假'
SET @married = '婚假'
SET @funeral = '丧假'
SET @pregnancy = '产假'
SET @holiday = '节假日上班'
SET @allRest = '全体放假'
SET @allDay = '全天'
SET @halfDay = '半天' SET @FirstDayOfThisMonth = @DutyDate - DAY(@DutyDate) + 1
SET @LastDayOfThisMonth = DATEADD(MONTH,1,@DutyDate - DAY(@DutyDate) + 1) - 1 SET @sql = 'SELECT EmpId,EmpName,DutyDate,'
+ 'CASE WHEN DutyId=1 THEN ''' + @common + '''' + '  WHEN DutyId=2 THEN ''' + @late + ''''
+ ' WHEN DutyId=3 THEN ''' + @affair + '''' +' WHEN DutyId=4 THEN ''' + @sick + '''' + ' WHEN DutyId=5 THEN ''' +@married + ''''
+ ' WHEN DutyId=6 THEN ''' + @funeral + '''' + ' WHEN DutyId=7 THEN ''' + @pregnancy + '''' + ' WHEN DutyId=8 THEN ''' + @holiday + ''''
+ 'ELSE ''' + @allRest + '''' + ' END,CASE WHEN DutyCount=1 THEN ''' + @allDay + '''' + ' ELSE ''' + @halfDay +'''' +' END,Salary,Bonus '
+ 'FROM DutyStatistic '
+ 'WHERE 1=1 ' SET @sql =@sql + ' AND EmpId=' + CAST(@EmpId AS CHAR(10))
SET @sql =@sql + ' AND DutyDate>=' + CAST(@FirstDayOfThisMonth AS VARCHAR(30))
SET @sql =@sql + ' AND DutyDate<=' +CAST(@LastDayOfThisMonth AS VARCHAR(30)) EXEC SP_EXECUTESQL @sql
ENDGO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
在查询分析器里能执行过去,可程序调用就会有问题,总是提示 --> 第 1 行: '1' 附近有语法错误
找了半天了,我都快疯了.那位大哥给帮忙看看.谢谢啦.

解决方案 »

  1.   

    将 EXEC SP_EXECUTESQL @sql 
    改为 PRINT @sql
    自己看一下就知道了.
    应该是传入的参数的问题.
      

  2.   

    SET @FirstDayOfThisMonth = @DutyDate - DAY(@DutyDate) + 1 
    SET @LastDayOfThisMonth = DATEADD(MONTH,1,@DutyDate - DAY(@DutyDate) + 1) - 1 这里貌似有问题
      

  3.   

    谢 fcuandy.SET @sql =@sql + ' AND DutyDate> =' + CAST(@FirstDayOfThisMonth AS VARCHAR(30)) 
    SET @sql =@sql + ' AND DutyDate <=' +CAST(@LastDayOfThisMonth AS VARCHAR(30)) 问题在这里,请问我怎样将日期型的变量转换成VARCHAR型,和字符串链接起来,谢谢啦.
      

  4.   

    SET @sql =@sql + ' AND DutyDate>  =''' + CAST(@FirstDayOfThisMonth AS VARCHAR(30))  + ''''
    SET @sql =@sql + ' AND DutyDate  <=''' +CAST(@LastDayOfThisMonth AS VARCHAR(30))  +''''