Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-14 : 05:44:21
|
I'm getteing an error saying "[Microsoft][ODBC SQL Server Driver]Invalid character value for cast specification" when i try to debug a store procedure.The Store Procedure parameters are as below.PROCEDURE clCreateUnpostedTrxEarnType (@SERIES int,@PERIODID int,@YEAR int,@PTRATIO float,@CPTYPE int,@CPTRXTYPE int,@Startdate datetime,@Enddate datetime,@O_iErrorState int = NULL output ) I'm passing the values as below3, 8, 2007, 3, 1, 3, '2007.08.01', '2007.08.31', NullI tried passing '20070801', '20070831' & 2007.08.01, 2007.08.31 for date.How should i fix this issue to debug the below issue?http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=83297Thanks & RegardsPradeep M V |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 05:47:33
|
| Are you sure it is the procedure heading that is causing the problem?Passing a date in format 'yyyymmdd' will work.Please post full SP code.Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-14 : 05:52:27
|
I have tried the same after searching in internet.But it didn't worked.I'm pasting the full SP for your reference.CREATE PROCEDURE clCreateUnpostedTrxEarnType (@SERIES int,@PERIODID int,@YEAR int,@PTRATIO float,@CPTYPE int,@CPTRXTYPE int,@Startdate datetime,@Enddate datetime,@O_iErrorState int = NULL output )ASDeclare @count intDeclare @tTransaction tinyint, @iError intBEGIN SELECT @O_iErrorState = 0 IF @@trancount = 0 BEGIN SELECT @tTransaction = 1 BEGIN TRANSACTION END IF @SERIES IS NULL OR @PERIODID IS NULL OR @YEAR IS NULL OR @PTRATIO IS NULL OR @CPTYPE IS NULL OR @CPTRXTYPE IS NULL OR @Startdate IS NULL OR @Enddate IS NULL BEGIN SELECT @iError = 20018 GOTO Error END DELETE CL40104 WHERE SYEAR=@YEAR AND SMONTH=@PERIODID AND CPTYPE=@CPTYPE AND CPTRXTYPE=@CPTRXTYPE SELECT @iError = @@error IF @iError <> 0 GOTO Error INSERT INTO CL40104 (SYEAR,SMONTH,CUSTNMBR,CPTYPE,CPTRXTYPE,CPTRXSOURCE,ORTRXSRC, COMMENT_4,CLFUNCSALAMNT,PTRATIO,CPPOINTS,CPPOSTED) SELECT @YEAR,@PERIODID,CASE WHEN f.CUSTNMBR IS NULL THEN g.CUSTNMBR ELSE f.CUSTNMBR END,@CPTYPE,@CPTRXTYPE,dbo.clGetNextTrxSource(@CPTYPE,@CPTRXTYPE,@PERIODID,@YEAR),'SOP', convert(varchar(24),getdate()), round((isnull(f.XTNDPRCE,0)- isnull(g.XTNDPRCE,0)),0),@PTRATIO, @PTRATIO*round((isnull(f.XTNDPRCE,0)- isnull(g.XTNDPRCE,0)),0),0 FROM (SELECT b.CUSTNMBR,sum(isnull(a.XTNDPRCE,0)) AS XTNDPRCE FROM SOP30300 a INNER JOIN SOP30200 b ON a.SOPTYPE=b.SOPTYPE AND a.SOPNUMBE=b.SOPNUMBE INNER JOIN CL40102 c ON b.CUSTNMBR=c.CUSTNMBR INNER JOIN IV00101 d ON a.ITEMNMBR=d.ITEMNMBR INNER JOIN EXT00103 e ON d.ITMCLSCD=e.PT_UD_Key WHERE b.GLPOSTDT >= c.REGDATE AND c.REGFLAG=1 AND e.PT_Window_ID='ITEMCLASSPRIV' AND a.PRCLEVEL NOT LIKE 'PRIV%' AND a.SOPTYPE=3 AND b.CUSTNMBR IS NOT NULL AND b.VOIDSTTS=0 AND b.GLPOSTDT BETWEEN @Startdate AND @Enddate group by b.CUSTNMBR) f FULL OUTER JOIN (select b.CUSTNMBR,sum(isnull(a.XTNDPRCE,0)) AS XTNDPRCE FROM SOP30300 a INNER JOIN SOP30200 b ON a.SOPTYPE=b.SOPTYPE AND a.SOPNUMBE=b.SOPNUMBE INNER JOIN CL40102 c ON b.CUSTNMBR=c.CUSTNMBR INNER JOIN IV00101 d ON a.ITEMNMBR=d.ITEMNMBR INNER JOIN EXT00103 e ON d.ITMCLSCD=e.PT_UD_Key WHERE b.GLPOSTDT >= c.REGDATE AND c.REGFLAG=1 AND e.PT_Window_ID='ITEMCLASSPRIV' AND a.PRCLEVEL NOT LIKE 'PRIV%' AND a.SOPTYPE=4 AND b.CUSTNMBR IS NOT NULL AND b.VOIDSTTS=0 AND b.GLPOSTDT BETWEEN @Startdate AND @Enddate group by b.CUSTNMBR) g on f.CUSTNMBR =g.CUSTNMBR SELECT @iError = @@error IF @iError <> 0 GOTO Error SELECT @count=count(1) FROM CL40104 WHERE SYEAR=@YEAR AND SMONTH=@PERIODID AND CPTYPE=@CPTYPE AND CPTRXTYPE=@CPTRXTYPE SELECT @iError = @@error IF @iError <> 0 GOTO Error UPDATE CL40106 SET CL_Trx_Source_ID=CL_Trx_Source_ID + @count WHERE CPTYPE=@CPTYPE AND CPTRXTYPE=@CPTRXTYPE SELECT @iError = @@error IF @iError <> 0 GOTO ErrorError: SELECT @O_iErrorState = @iErrorENDIF @O_iErrorState <> 0BEGIN IF @tTransaction = 1 ROLLBACK TRANSACTION ENDELSE IF @tTransaction = 1 COMMIT TRANSACTION RETURN GO Thanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 06:23:29
|
This SELECT statements is twice as fastCREATE PROCEDURE clCreateUnpostedTrxEarnType( @SERIES INT, @PERIODID INT, @YEAR INT, @PTRATIO FLOAT, @CPTYPE INT, @CPTRXTYPE INT, @StartDate DATETIME, @EndDate DATETIME, @O_iErrorState INT = NULL OUTPUT )ASSET NOCOUNT ONDECLARE @Count INT, @tTransaction TINYINT, @iError INTSET @O_iErrorState = 0 IF @@trancount = 0 BEGIN SET @tTransaction = 1 BEGIN TRANSACTION END IF @SERIES IS NULL OR @PERIODID IS NULL OR @YEAR IS NULL OR @PTRATIO IS NULL OR @CPTYPE IS NULL OR @CPTRXTYPE IS NULL OR @Startdate IS NULL OR @Enddate IS NULL BEGIN SET @iError = 20018 GOTO Error ENDDELETEFROM CL40104WHERE SYEAR = @YEAR AND SMONTH = @PERIODID AND CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPESET @iError = @@ERRORIF @iError <> 0 GOTO Error INSERT CL40104 ( SYEAR, SMONTH, CUSTNMBR, CPTYPE, CPTRXTYPE, CPTRXSOURCE, ORTRXSRC, COMMENT_4, CLFUNCSALAMNT, PTRATIO, CPPOINTS, CPPOSTED )SELECT @YEAR, @PERIODID, f.CUSTNMBR, @CPTYPE, @CPTRXTYPE, dbo.clGetNextTrxSource(@CPTYPE, @CPTRXTYPE, @PERIODID, @YEAR), 'SOP', CONVERT(VARCHAR, CURRENT_TIMESTAMP, 101), ROUND(f.XTNDPRCE_3 - f.XTNDPRCE_4, 0), @PTRATIO, @PTRATIO * ROUND(f.XTNDPRCE_3 - f.XTNDPRCE_4, 0), 0FROM ( SELECT b.CUSTNMBR SUM(CASE WHEN a.SOPTYPE = 3 THEN ISNULL(a.XTNDPRCE, 0) ELSE 0) END AS XTNDPRCE_3, SUM(CASE WHEN a.SOPTYPE = 4 THEN ISNULL(a.XTNDPRCE, 0) ELSE 0) END AS XTNDPRCE_4, FROM SOP30300 AS a INNER JOIN SOP30200 AS b ON b.SOPTYPE = a.SOPTYPE AND b.SOPNUMBE = a.SOPNUMBE INNER JOIN CL40102 AS c ON c.CUSTNMBR = b.CUSTNMBR AND c.REGFLAG = 1 INNER JOIN IV00101 AS d ON d.ITEMNMBR = a.ITEMNMBR INNER JOIN EXT00103 AS e ON e.PT_UD_Key = d.ITMCLSCD AND e.PT_Window_ID = 'ITEMCLASSPRIV' WHERE b.GLPOSTDT >= c.REGDATE AND a.PRCLEVEL NOT LIKE 'PRIV%' AND a.SOPTYPE = 3 AND b.CUSTNMBR IS NOT NULL AND b.VOIDSTTS = 0 AND b.GLPOSTDT BETWEEN @Startdate AND @Enddate GROUP BY b.CUSTNMBR ) AS fSET @iError = @@ERRORIF @iError <> 0 GOTO ErrorSELECT @Count = COUNT(*)FROM CL40104WHERE SYEAR = @YEAR AND SMONTH = @PERIODID AND CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPE SET @iError = @@ERRORIF @iError <> 0 GOTO Error UPDATE CL40106SET CL_Trx_Source_ID = CL_Trx_Source_ID + @CountWHERE CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPESET @iError = @@ERRORIF @iError <> 0 GOTO ErrorError:SET @O_iErrorState = @iErrorIF @O_iErrorState <> 0 IF @tTransaction = 1 ROLLBACK TRANSACTION ELSE IF @tTransaction = 1 COMMIT TRANSACTION GO Peter LarssonHelsingborg, SwedenEdited the CASE WHEN parts... |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-14 : 06:35:18
|
| Thanks Peter for above modification.But i'm really looking for the debugging of the SP for fixing the issue mentioned in http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=83297.Can you give some suggestion to get rid of ODBC Error?Thanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 06:40:21
|
| What is the COMMENT_4 datatype?There are no other conversions being made. Unless there is some in the clGetNextTrxSource function?Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-14 : 06:52:23
|
| Can you tell me what is the difference between getdate() and CURRENT_TIMESTAMP?Thanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-14 : 06:54:46
|
| No difference. I prefer CURRENT_TIMESTAMP because there are less paranthesis to keep track of.Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-14 : 07:08:44
|
quote: Originally posted by Peso No difference. I prefer CURRENT_TIMESTAMP because there are less paranthesis to keep track of.
So i think i can use CONVERT(char(12), CURRENT_TIMESTAMP, 107) instead of CONVERT(char(12), GETDATE(),107).Thanks & RegardsPradeep M V |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 05:55:25
|
| Hello PeterThe above procedure also didn't worked.I'm getting same error?What the reasons for getting above error?Thanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-15 : 05:59:05
|
| What datatype is column GLPOSTDT using? I sure hope it is DATETIME...Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 06:02:00
|
| yes, its DATETIMEThanks & RegardsPradeep M V |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 06:06:24
|
| i've tried using CONVERT(VARCHAR(24), CURRENT_TIMESTAMP) & CONVERT(VARCHAR, CURRENT_TIMESTAMP,101). Any other suggestion?Thanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-15 : 06:10:37
|
| One other thing...All the columns used for JOINING the tables, do they have the same datatype?INNER JOIN SOP30200 AS b ON b.SOPTYPE = a.SOPTYPE AND b.SOPNUMBE = a.SOPNUMBEINNER JOIN CL40102 AS c ON c.CUSTNMBR = b.CUSTNMBR AND c.REGFLAG = 1INNER JOIN IV00101 AS d ON d.ITEMNMBR = a.ITEMNMBRINNER JOIN EXT00103 AS e ON e.PT_UD_Key = d.ITMCLSCD AND e.PT_Window_ID = 'ITEMCLASSPRIV'Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 06:10:54
|
Please find the function belowCREATE FUNCTION clGetNextTrxSource ( @CPTYPE INT, @CPTRXTYPE INT, @PERIODID INT, @YEAR INT)RETURNS NVARCHAR(13)AS/*pvasu 5/4/07 Initial Implementation To Get Next CL Transaction Source*/BEGINDECLARE @NextTrxSource nvarchar(13), @CLTrxSourceID int, @CLTRXSRCIDABR nvarchar(3), @i int, @string char(10) SELECT @CLTrxSourceID=CL_Trx_Source_ID,@CLTRXSRCIDABR=CLTRXSRCIDABR FROM CL40106 WHERE CPTYPE=@CPTYPE AND CPTRXTYPE=@CPTRXTYPE if @CPTRXTYPE=1 SELECT @CLTrxSourceID=@CLTrxSourceID + 1 FROM CL40104 WHERE SYEAR=@YEAR AND SMONTH=@PERIODID AND CPTYPE=@CPTYPE AND CPTRXTYPE=@CPTRXTYPE else SELECT @CLTrxSourceID=count(1) + @CLTrxSourceID FROM CL40104 WHERE SYEAR=@YEAR AND SMONTH=@PERIODID AND CPTYPE=@CPTYPE AND CPTRXTYPE=@CPTRXTYPE SELECT @i=len(LTRIM(RTRIM(STR(@CLTrxSourceID)))) SELECT @string= CASE @i WHEN 1 THEN '000000000' WHEN 2 THEN '00000000' WHEN 3 THEN '0000000' WHEN 4 THEN '000000' WHEN 5 THEN '00000' WHEN 6 THEN '0000' WHEN 7 THEN '000' WHEN 8 THEN '00' WHEN 9 THEN '0' WHEN 10 THEN '' END SELECT @NextTrxSource=@CLTRXSRCIDABR + LTRIM(RTRIM(@string)) + LTRIM(RTRIM(STR(@CLTrxSourceID))) RETURN(@NextTrxSource)ENDGO Thanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-15 : 06:11:34
|
| c.REGDATE is also DATETIME?Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 06:16:39
|
| e.PT_UD_Key = d.ITMCLSCD two have datatype as Char but length is different.Other fields have all same data types.Thanks & RegardsPradeep M V |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 06:17:52
|
| yes,it is also DATETIMEThanks & RegardsPradeep M V |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-05-15 : 06:23:30
|
This part IF @CPTRXTYPE = 1 SELECT @CLTrxSourceID = @CLTrxSourceID + 1 FROM CL40104 WHERE SYEAR = @YEAR AND SMONTH = @PERIODID AND CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPE ELSE SELECT @CLTrxSourceID = @CLTrxSourceID + COUNT(1) FROM CL40104 WHERE SYEAR = @YEAR AND SMONTH = @PERIODID AND CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPE is so very wrong on so many levels.What are you trying to accomplish here? What is the logic?A new serial number based on previous one? Add one and return the new serial?What do the check IF @CPTRXTYPE = 1 do?Peter LarssonHelsingborg, Sweden |
 |
|
|
pradeepmv
Starting Member
27 Posts |
Posted - 2007-05-15 : 06:32:28
|
Hi that can be rewritten asIF @CPTRXTYPE = 1 SELECT @CLTrxSourceID = @CLTrxSourceID + 1 ELSE SELECT @CLTrxSourceID = @CLTrxSourceID + COUNT(1) FROM CL40104 WHERE SYEAR = @YEAR AND SMONTH = @PERIODID AND CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPE Here i'm calling this function from an insert statement in above procedure which will insert a set of record .In function i cannot use below update statement to update my setup tableUPDATE CL40106SET CL_Trx_Source_ID = CL_Trx_Source_ID + 1WHERE CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPE So i'm taking the count() and creating a new trx source assuming that after each single insert the count will be increased by one.In procedure i'm updating my setup table asUPDATE CL40106SET CL_Trx_Source_ID = CL_Trx_Source_ID + @CountWHERE CPTYPE = @CPTYPE AND CPTRXTYPE = @CPTRXTYPE Thanks & RegardsPradeep M V |
 |
|
|
Next Page
|
|
|
|
|