存储过程:
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
ALTER     PROCEDURE [SM_ProInputGather] 
@PROVNAME VARCHAR(50),
@BEGINDATE DATETIME,
@ENDDATE  DATETIME
AS
DECLARE @SQL VARCHAR(1000)
SELECT @SQL=
'SELECT C.PRODUCTNAME ,C.PRODUCTTYPE ,D.UNITNAME ,B.PRICE ,SUM(B.NUM) ,E.PROVNAME  
FROM SM_INPUTPROD A ,SM_INPUTPRODDETAIL B ,SM_PRODUCT C ,SM_UNIT D ,SM_PROVIDER E 
WHERE A.INPUTNO=B.INPUTNO AND B.PRODUCTID=C.PRODUCTID AND C.UNITID=D.UNITID 
AND A.PROVID=E.PROVID '
IF( @PROVNAME != '' )
SELECT @SQL=@SQL+' AND E.PROVNAME LIKE ''%'+ @PROVNAME +'%'' '
IF( @BEGINDATE !='' AND @ENDDATE!='')
SELECT @SQL=@SQL+' AND ( A.INPUTDATE BETWEEN '''+@BEGINDATE+''' AND '''+@ENDDATE+''' ) '
SELECT @SQL=@SQL+'
GROUP BY C.PRODUCTNAME ,C.PRODUCTTYPE ,D.UNITNAME ,B.PRICE ,E.PROVNAME
ORDER BY C.PRODUCTNAME ,E.PROVNAME'
EXEC (@SQL)
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO调用EXEC SM_ProInputGather '宝胜','2006-9-14','2006-9-16'但是却报错:
服务器: 消息 241,级别 16,状态 1,过程 SM_ProInputGather,行 17
从字符串转换为 datetime 时发生语法错误。
请教哪里错了,谢谢

解决方案 »

  1.   

    SELECT @SQL=@SQL+' AND ( A.INPUTDATE BETWEEN '''+convert(varchar(10),@BEGINDATE,120)+''' AND '''+convert(varchar(10),@ENDDATE,120)+''' ) '
      

  2.   


    A.INPUTDATE 
    改成
    CAST(A.INPUTDATE AS datetime)
      

  3.   

    ALTER     PROCEDURE [SM_ProInputGather] 
    @PROVNAME VARCHAR(50),
    @BEGINDATE varchar(50),
    @ENDDATE  varchar(50)
    AS
    DECLARE @SQL VARCHAR(1000)
    SELECT @SQL=
    'SELECT C.PRODUCTNAME ,C.PRODUCTTYPE ,D.UNITNAME ,B.PRICE ,SUM(B.NUM) ,E.PROVNAME  
    FROM SM_INPUTPROD A ,SM_INPUTPRODDETAIL B ,SM_PRODUCT C ,SM_UNIT D ,SM_PROVIDER E 
    WHERE A.INPUTNO=B.INPUTNO AND B.PRODUCTID=C.PRODUCTID AND C.UNITID=D.UNITID 
    AND A.PROVID=E.PROVID '
    IF( @PROVNAME != '' )
    SELECT @SQL=@SQL+' AND E.PROVNAME LIKE ''%'+ @PROVNAME +'%'' '
    IF( @BEGINDATE !='' AND @ENDDATE!='')
    SELECT @SQL=@SQL+' AND ( A.INPUTDATE BETWEEN '''+@BEGINDATE+''' AND '''+@ENDDATE+''' ) '
    SELECT @SQL=@SQL+'
    GROUP BY C.PRODUCTNAME ,C.PRODUCTTYPE ,D.UNITNAME ,B.PRICE ,E.PROVNAME
    ORDER BY C.PRODUCTNAME ,E.PROVNAME'
    EXEC (@SQL)
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    改前面的就可以拉
      

  4.   

    一楼的错了,错误是从字符串转换为 datetime 时,不是datetime转换到字符串sm_inputprod.inputdate不能转换为datetime
      

  5.   

    数据库记录是:2006-9-15 9:29:20 格式,
    但是我执行时:
    EXEC SM_ProInputGather '宝胜','2006-9-14','2006-9-16'却没有结果,WHY???
      

  6.   

    帮你改好了,给分啊^_^,别耍赖!!!SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
    CREATE     PROCEDURE [SM_PROINPUTGATHER] 
    @PROVNAME VARCHAR(50),
    @BEGINDATE DATETIME,
    @ENDDATE  DATETIME
    ASDECLARE @SQL VARCHAR(1000)
    SELECT @SQL=
    'SELECT C.PRODUCTNAME ,C.PRODUCTTYPE ,D.UNITNAME ,B.PRICE ,SUM(B.NUM) ,E.PROVNAME  
    FROM SM_INPUTPROD A ,SM_INPUTPRODDETAIL B ,SM_PRODUCT C ,SM_UNIT D ,SM_PROVIDER E 
    WHERE A.INPUTNO=B.INPUTNO AND B.PRODUCTID=C.PRODUCTID AND C.UNITID=D.UNITID 
    AND A.PROVID=E.PROVID '
    IF( @PROVNAME != '' )
    SELECT @SQL=@SQL+' AND E.PROVNAME LIKE ''%'+ @PROVNAME +'%'' '
    IF( CAST(@BEGINDATE AS NVARCHAR(20)) !='' AND CAST(@ENDDATE AS NVARCHAR(20))!='')
    SELECT @SQL=@SQL+' AND ( A.INPUTDATE BETWEEN '''+CAST(@BEGINDATE AS NVARCHAR(20))+''' AND '''+CAST(@ENDDATE AS NVARCHAR(20))+''' ) '
    SELECT @SQL=@SQL+'
    GROUP BY C.PRODUCTNAME ,C.PRODUCTTYPE ,D.UNITNAME ,B.PRICE ,E.PROVNAME
    ORDER BY C.PRODUCTNAME ,E.PROVNAME' EXEC (@SQL)
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO