I would like to see your variable definitions, but I suspect because @FROMDATE and @TODATE are datetime, and you use them in the string concatenation statement. So you can fix this:
SET @SQL1 = 'SELECT B.FacId, B.FacName, B.BookCode, B.BookName, B.Quantity, CONVERT(VARCHAR(10), B.TillDate, 104) AS TILLDATE FROM ' +@TABLE +' B WHERE B.TillDate BETWEEN CONVERT(VARCHAR(10),'+CAST(@FROMDATE as varchar(15))+', 101) and CONVERT(VARCHAR(10), DATEADD(DD,1,'+CAST(@TODATE as varchar(15))+'), 101)'
However, the best solutions are:
- Don't use dynamic SQL at all, maybe @TABLE is not that different, and you can combine them in a form or something.
- Pass parameters directly to sp_executeSQL and thus save their types, for example.
SET @SQL1 = 'SELECT B.FacId, B.FacName, B.BookCode, B.BookName, B.Quantity, B.TillDate AS TILLDATE FROM ' +@TABLE +' B WHERE B.TillDate BETWEEN @inFROMDATE and @inTODATE'
EXEC SP_EXECUTESQL @SQL1,'@inFROMDATE datetime, @inTODATE',@inFromDate = @FROMDATE, @inTODATE = @TODate
source share