SpatialDB Advisor
|
Current SQL Server Blog Articles • Extract Polygons from result of STIntersection in SQL Server Spatial • Function to round ordinates of a SQL Server Spatial geometry object • Extract elements of SQL Server Spatial geometry object • Counting number of polygon rings SQL Server Spatial • Filtering Polygon Rings in SQL Server Spatial • Function to Move a geometry object in SQL Server Spatial • Alternate Centroid Functions for SQL Server Spatial • Function to Rotate geometry objects in SQL Server Spatial • A GetVertices wrapper for DumpPoints in SQL Server 2008 Spatial • Creating a Morton number Space Key generator for SQL Server • Gridding a geometry or geography object (SQL Server Denali) • On hinting spatial indexes • Random Search Procedure (SQL Server 2008 Spatial) • COGO: Converting (Google Earth) Formatted Longitude/Latitude points to decimal degrees (SQL Server) • COGO: Convert Degrees, Minutes and Seconds values to Decimal Degrees • COGO: DD2DMS Formatting a latitude/longitude decimal degree value • COGO: Create point from bearing and distance • COGO: Compute number of vertices required to stroke circle or circular arc • COGO: Calculating the bearing between two points (SQL Server 2008 Spatial) • COGO: Compute arc length subtended by angle centre of circle • COGO: Compute chord length of segment of a circle (arc) • COGO: Computing Arc To Chord (Arc2Chord) Separation • COGO: Creating a stroked polygon from a circle's centre x,y and radius • COGO: Finding centre and radius of a curve defined by three points: FindCircle function • Identifying Tight Radius Curves sections within LineString geometry data • Generating random point data for SQL Server 2008 Spatial • New Presentation on Active (Searchable) Spatial Metadata for SQL Server 2008 Spatial and FreeText • Checking is a column in a table or a view is of type geometry or geography • Extracting geometry type string values from geometry/geography objects in SQL Server 2008 Spatial • Vectorising geometry objects in SQL Server 2008 • MBR to geography/geometry helper functions • Extracting geometry types from geometry/geography objects in SQL Server 2008 • Getting the number of coordinate dimensions of a geometry/geography object in SQL Server 2008 • A Dump Points Function for SQL Server 2008 Spatial • toGeography and toGeography Conversion Functions for SQL Server 2008 Spatial • Write text file with spatial data from SQL Server 2008 • String Tokenizer for SQL Server 2008 written in TSQL • Loading Shapefiles into Geography type column in SQL Server 2008 • generate_series for SQL Server 2008 • Tip #6: Correcting invalid geometries • Tip #5: Where or where has my little column gone • Tip #4: What Coordinate System is that? • Tip #3: What object is that? • Tip #2: Spatial Indexing and Primary Keys • Tip #1: SQL Server 2008 "Katmai" - Setting SRIDs
|
Update: Tokenizer has been updated for Denali analytic features and to expose the separators in the output. We often have need of string tokenizers in applications. I had need of one in some TSQL development I am currently doing for a customer. I had previously written one for Oracle so I decided to re-write it for SQL Server 2008 (I believe it should work in 2005). The main limitations with the conversion are the lack of a hierarchical “CONNECT BY LEVEL” clause and the lack of a LEAD function for SQL Server’s limited implementation of analytics. Also, the function is dependent on my generate_series() function as described in this article Still, with a little perseverance I came up with a working implementation. Here it is.
Here are my, simple, tests.
Result.
Result.
Now, if you want to collect them back into a single string, here’s an example of what you can do.
Result.
Upgraded Version for Denali
Result.
Result.
I hope that someone out there finds this useful. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
![]()
![]() |
Comment [5]
Simon,
Thanks for the article. I think I’ve had several occasions when I thought would be nice to have a string tokenizer, but been lazy too to look for a script for one for SQL Server or roll my own.
For a group concatenation function for strings I have one of those .NET custom aggregate functions, mostly because I can never remember the XML path syntax and its a bit easier to write.
The disadvantage of that is .NET by default is disabled in SQL Server so have to enable it in surface area etc. and getting an admin for a customer to do this is oh so frustrating – I often wait for it to be escalated to some administrator who has a clue which sometimes takes a week for a 1 minute configuration change.
It would have been really nice if SQL Server 2008 allowed defining aggregates in T-SQL similar to what PostgreSQL allows with sql/plpgsql.
By the way I think your code would work fine in SQL Server 2005 too. Will have to give it a try.
— Regina · 30 August 2009, 01:23 · #
Simon
Just a small note that all your @ symbols have been removed from your variables in the function.
— James · 31 August 2009, 10:17 · #
James,
Thanks for letting me know: the article should, now, be fixed.
regards
Simon
— Simon · 31 August 2009, 10:56 · #
Nice. However, this would have been even better if it returned some kind of order for the tokens. Let’s say I want to reliably identify the second token in the string… how do I do that? As far as I know, an SQL table is unordered by definition.
— Darren · 22 January 2011, 04:33 · #
Yes, relational theory says that a relation (table), is not ordered. To order you have to include an ORDER BY clause in the SQL.
So, if you pulled the SQL out the function, removed the INSERT, and instead of:
Select SUBSTRING, (d.end_p – d.beg – 1) ) token
you put
Select d.beg, SUBSTRING, (d.end_p – d.beg – 1) ) token
you will see the ordering is preserved.
If not, just add:
Order by d.beg
at the end. That is:
Select SUBSTRING, (d.end_p – d.beg – 1) ) token
From (Select BASE.beg,
LEAD.beg end_p,
BASE.fullstring
From MyCTE BASE
LEFT JOIN MyCTE LEAD
ON BASE.RowVersion = LEAD.RowVersion-1
) d
Where d.end_p Is Not Null
And d.end_p > d.beg + 1
order by d.beg;
Simon
— Simon Greener · 22 January 2011, 13:37 · #