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.

 All Forums
 General SQL Server Forums
 New to SQL Server Programming
 Invalid character value for cast specification

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 below

3, 8, 2007, 3, 1, 3, '2007.08.01', '2007.08.31', Null

I 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=83297


Thanks & Regards

Pradeep 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 Larsson
Helsingborg, Sweden
Go to Top of Page

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
)
AS
Declare @count int
Declare @tTransaction tinyint,
@iError int
BEGIN
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 Error
Error:
SELECT @O_iErrorState = @iError
END

IF @O_iErrorState <> 0
BEGIN
IF @tTransaction = 1
ROLLBACK TRANSACTION
END
ELSE IF @tTransaction = 1
COMMIT TRANSACTION

RETURN

GO


Thanks & Regards

Pradeep M V
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2007-05-14 : 06:23:29
This SELECT statements is twice as fast
CREATE PROCEDURE clCreateUnpostedTrxEarnType
(
@SERIES INT,
@PERIODID INT,
@YEAR INT,
@PTRATIO FLOAT,
@CPTYPE INT,
@CPTRXTYPE INT,
@StartDate DATETIME,
@EndDate DATETIME,
@O_iErrorState INT = NULL OUTPUT
)
AS

SET NOCOUNT ON

DECLARE @Count INT,
@tTransaction TINYINT,
@iError INT

SET @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
END

DELETE
FROM CL40104
WHERE SYEAR = @YEAR
AND SMONTH = @PERIODID
AND CPTYPE = @CPTYPE
AND CPTRXTYPE = @CPTRXTYPE

SET @iError = @@ERROR

IF @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),
0
FROM (
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 f

SET @iError = @@ERROR

IF @iError <> 0
GOTO Error

SELECT @Count = COUNT(*)
FROM CL40104
WHERE SYEAR = @YEAR
AND SMONTH = @PERIODID
AND CPTYPE = @CPTYPE
AND CPTRXTYPE = @CPTRXTYPE

SET @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

SET @iError = @@ERROR

IF @iError <> 0
GOTO Error

Error:

SET @O_iErrorState = @iError

IF @O_iErrorState <> 0
IF @tTransaction = 1
ROLLBACK TRANSACTION
ELSE
IF @tTransaction = 1
COMMIT TRANSACTION
GO

Peter Larsson
Helsingborg, Sweden

Edited the CASE WHEN parts...
Go to Top of Page

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 & Regards

Pradeep M V
Go to Top of Page

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 Larsson
Helsingborg, Sweden
Go to Top of Page

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 & Regards

Pradeep M V
Go to Top of Page

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 Larsson
Helsingborg, Sweden
Go to Top of Page

pradeepmv
Starting Member

27 Posts

Posted - 2007-05-14 : 07:03:14
COMMENT_4 is character datatype.
In function clGetNextTrxSource there is no conversions.Its code part is already there in below thread
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=83297

Thanks & Regards

Pradeep M V
Go to Top of Page

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 & Regards

Pradeep M V
Go to Top of Page

pradeepmv
Starting Member

27 Posts

Posted - 2007-05-15 : 05:55:25
Hello Peter

The above procedure also didn't worked.I'm getting same error?
What the reasons for getting above error?

Thanks & Regards

Pradeep M V
Go to Top of Page

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 Larsson
Helsingborg, Sweden
Go to Top of Page

pradeepmv
Starting Member

27 Posts

Posted - 2007-05-15 : 06:02:00
yes, its DATETIME

Thanks & Regards

Pradeep M V
Go to Top of Page

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 & Regards

Pradeep M V
Go to Top of Page

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.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'


Peter Larsson
Helsingborg, Sweden
Go to Top of Page

pradeepmv
Starting Member

27 Posts

Posted - 2007-05-15 : 06:10:54
Please find the function below

CREATE 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
*/
BEGIN

DECLARE @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)
END

GO


Thanks & Regards

Pradeep M V
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2007-05-15 : 06:11:34
c.REGDATE is also DATETIME?


Peter Larsson
Helsingborg, Sweden
Go to Top of Page

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 & Regards

Pradeep M V
Go to Top of Page

pradeepmv
Starting Member

27 Posts

Posted - 2007-05-15 : 06:17:52
yes,it is also DATETIME

Thanks & Regards

Pradeep M V
Go to Top of Page

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 Larsson
Helsingborg, Sweden
Go to Top of Page

pradeepmv
Starting Member

27 Posts

Posted - 2007-05-15 : 06:32:28
Hi that can be rewritten as
IF @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 table
UPDATE	CL40106
SET CL_Trx_Source_ID = CL_Trx_Source_ID + 1
WHERE 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 as
UPDATE	CL40106
SET CL_Trx_Source_ID = CL_Trx_Source_ID + @Count
WHERE CPTYPE = @CPTYPE
AND CPTRXTYPE = @CPTRXTYPE



Thanks & Regards

Pradeep M V
Go to Top of Page
    Next Page

- Advertisement -