[dba-SQLServer]Creating Sproc over 8000 chars long

Djabarov, Robert Robert.Djabarov at usaa.com
Thu Sep 25 13:17:35 CDT 2003


Well, since I'm not writing any articles, here's the function that
Arthur may have:

create function dbo.fn_ParseStringToIntValues (
   @str varchar(8000) ) returns @tbl table (IntValue int not null)
as begin
   declare @pos int
   
   while charindex(',', @str, 1) > 0 begin
      set @pos = charindex(',', @str, 1)
      insert @tbl values (cast(substring(@str, 1, @pos-1) as int))
      set @str = substring(@str, @pos+1, datalength(@str)- at pos)
   end
   insert @tbl values (cast(@str as int))
   return
end
go
select * from dbo.fn_ParseStringToIntValues
('123,432,456,4356,43234,1,2,3') order by 1

-----Original Message-----
From: dba-sqlserver-bounces at databaseadvisors.com
[mailto:dba-sqlserver-bounces at databaseadvisors.com] On Behalf Of David
Emerson
Sent: Wednesday, September 24, 2003 5:04 PM
To: dba-sqlserver at databaseadvisors.com
Subject: RE: [dba-SQLServer]Creating Sproc over 8000 chars long


Thanks Arthur,

I found that I had used a temp table in another (programmed later) part
of 
the FE.  I seemed to have come to the same conclusion but hadn't gone
back 
and updated old code.

David

At 24/09/2003, you wrote:
>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
>
>
>
>_______________________________________________
>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



More information about the dba-SQLServer mailing list