IMO, ibatis should never, ever handle this sort of thing. :-P

You can however, use this table function (or a variant - listing below).

Now, you can change your join to do this:

select *
from order
join orderline on order.orderid = orderline.orderid
join dbo.stringsplit(#someIdValues#) SomeIdValues on order.orderid =
SomeIdValues.scalarId

Then you pass one parameter (someIdValues) that is "1,2,3,4,5", and it
gets split on the server...so now you can pass 2000000 parameters. ;-)

Larry


--------
CREATE FUNCTION [dbo].[StringSplit] (@CommaList varchar(8000) )
RETURNS @SCALARLIST TABLE (ScalarId varchar(8000) collate database_default)
AS BEGIN
DECLARE @firstpos integer, @nextscalarid varchar(8000)

        SET @firstpos = 8000

        WHILE @firstpos > 0 AND @CommaList <> ','
        BEGIN
                SELECT @firstpos = CHARINDEX (',', @CommaList)
                IF @firstpos = 0
                BEGIN
                        SELECT  @nextscalarid = CAST ( @CommaList AS 
varchar(8000) )
                END
                ELSE
                BEGIN
                        SELECT  @nextscalarid = CAST ( (SUBSTRING (@CommaList, 
1, @firstpos
- 1) ) AS varchar(8000) )
                END

                IF @firstpos < LEN (@CommaList)
                        SET @CommaList = SUBSTRING (@CommaList, @firstpos + 1, 
8000)
                ELSE
                        SET @CommaList = SUBSTRING (@CommaList, @firstpos, 8000)

                INSERT INTO @SCALARLIST
                VALUES (
                LTRIM(@nextscalarid) )
        END

        RETURN
END

--------

On Wed, Aug 20, 2008 at 6:48 AM, Eetu Huisman EFECTE
<[EMAIL PROTECTED]> wrote:
> Hi,
>
> We've bumped into an issue MSSQL has with parameter list length in an "IN" 
> query. I tried searching around the mailing list archives, JIRA and wiki, but 
> no-one seems to have had the same problem before.
>
> When MSSQL is given more than 2000 parameters for a IN, it fails:
>
> java.sql.SQLException: Prepared or callable statement has more than 2000 
> parameter markers.
> at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:1139)
> at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:156)
> at 
> net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:104)
> at 
> net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java:2020)
> at 
> net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java:1980)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at 
> com.ibatis.common.jdbc.SimpleDataSource$SimplePooledConnection.invoke(SimpleDataSource.java:958)
> at $Proxy15.prepareStatement(Unknown Source) at 
> com.ibatis.sqlmap.engine.execution.SqlExecutor.prepareStatement(SqlExecutor.java:494)
> at 
> com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:176)
> at 
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery(GeneralStatement.java:205)
> at 
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)
>
> It can be worked around in higher level Java code (by splitting the parameter 
> list into smaller chunks and then combining the results), but it would of 
> course be better if iBatis had a way to handle these kind limitations. Has 
> anyone any ideas whether it could be handled with any kind of configuration, 
> or should I file a ticket about it? (Some versions of Oracle had a similar 
> limit set at a 1000 parameters.)
>
> --
> Eetu Huisman | Software Developer
> Efecte Corp. Global Operations
> Kumpulantie 3, FI-00520 Helsinki, Finland
> Mobile +358 50 910 7958
> http://www.efecte.com
>

Reply via email to