Arthur Fuller
artful at rogers.com
Wed Sep 24 13:28:53 CDT 2003
I just wrote a UDF that takes a comma delimited string (which would
normally be passed as the argument to IN(), but instead it breaks the
string apart into its components and creates a temporary table, which
can then be joined to the table(s) of interest.
Unfortunately I can't show it to you yet because it's part of one of my
forthcoming SQL Tips columns :-)
The point of the exercise was, lots of arguments to IN() results in very
slow execution. Joining a temp table is WAY faster.
Arthur
-----Original Message-----
From: dba-sqlserver-bounces at databaseadvisors.com
[mailto:dba-sqlserver-bounces at databaseadvisors.com] On Behalf Of David
Emerson
Sent: Monday, September 22, 2003 6:17 PM
To: dba-sqlserver at databaseadvisors.com
Subject: Re: [dba-SQLServer]Creating Sproc over 8000 chars long
Thanks Stuart. Since the database is likely to start running into
several
thousand customers it looks like I will need to run the table way.
David
At 23/09/2003, you wrote:
>On 23 Sep 2003 at 12:16, David Emerson wrote:
>
> > I have a sproc that accepts a string as a parameter which is used in
> > a where clause to filter out customers.
> >
> > The string is created by looping through a list box and adding the
> > customers that have been selected:
> >
> > strList = strList & " or ((CustomerID) = " & .ItemData(varItem) &
> > ")"
> >
>
>
>You will build a much smaller string if you use
>
>'initialise the string
>strList = "CustomerID IN ("
>......
>'build the list
>strList = strList & ItemData(varItem) & ","
>........
>
>'strip trailing comma and close the expression
>strList = left$(strList,Len(strList)-1) & ")"
>
> > This goes into a statement which starts like this:
> >
> > DECLARE @qs varchar (8000)
> >
> > SELECT @qs = 'INSERT INTO ttmpExportMerge (CustomerName,
> > TradingName,
> ... etc
> >
> > However the problem is that there could be over 1600 customers and
> > this means that strList is over 8000 character which exceeds the @qs
> > length (without even allowing for the rest of the sproc).
> >
> > Is there a data type that can handle these numbers? I tried 'text'
> > but
> the
> > sproc errors with "text is invalid for local variables"
> >
>Nope, your stuck with data types which can have a maximum of 8000
>characters.
>
>If the IN construct still gives you more than 8000 characters you're
>SOOL with that approach.
>
> > Is my only option to write the customer ID to a table and join it to
> > the rest of the sproc?
> >
>
>That's one option.
>Another may be to have a "Selected" field in the customer table which
>you set somehow rather than building the where string. If this is
>likely to be multi user, I'd probably go with your option of building a
>temp table of selected IDs and joining it.
>
>
>
>--
>Stuart McLachlan
>Lexacorp Ltd
>Application Development, IT Consultancy http://www.lexacorp.com.pg
>
>_______________________________________________
>dba-SQLServer mailing list
>dba-SQLServer at databaseadvisors.com
>http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
>http://www.databaseadvisors.com
_______________________________________________
dba-SQLServer mailing list
dba-SQLServer at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
http://www.databaseadvisors.com
---
Incoming mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.510 / Virus Database: 307 - Release Date: 8/14/2003
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.510 / Virus Database: 307 - Release Date: 8/14/2003