June 18, 2008 at 11:44 pm
Matt Miller (6/18/2008)
Heck I often think I get more out of doing the actual testing than those watching on the sides, so it's certainly not entirely altruistic
Thanks for looking for those tests... yeah, I think they all slid into the 500+ bit bucket.
So far as testing, writing articles, and solving posts... I'm right there with ya... no better teacher than doing...
--Jeff Moden
Change is inevitable... Change for the better is not.
June 19, 2008 at 12:34 pm
Here you go:
ALTER function [dbo].[fnSplit1](
@parameter varchar(Max)-- the string to split
, @Seperator Varchar(64)-- the string to use as a seperator
)
RETURNS @Items TABLE(
ID INT-- the element number
, item VARCHAR(8000)-- the split-out string element
, OffSet int-- the original offest
--( not entirley accurate if LEN(@Seperator) > 1 because of the Replace() )
)
AS
BEGIN
/*
"Monster" Split in SQL Server 2005
From Jeff Moden, 2008/05/22
BYoung, 2008/06/18: Modified to be a Table-Valued Function
And to handle CL/LF or LF-only line breaks
(Note: make it inline later, to make it faster)
Test: (scripts all triggers in your database)
Select Lines.Item
From sys.sql_modules M
Join sys.objects O on O.object_id = M.object_id
cross apply dbo.fnSplit1(M.definition, char(13)+char(10)) Lines
Where O.Type = 'TR'
Order by O.create_date, Lines.ID
*/
Declare @Sep char(1)
Set @Sep = char(10)--our seperator character
--NOTE: we make the @Sep character LF so that we will automatically
-- parse out rogue LF-only line breaks.
--===== Add start and end seprators to the Parameter so we can handle
-- all the elements the same way
-- Also change the seperator expressions to our seperator
-- character to keep all offsets = 1
SET @Parameter = @Sep+ Replace(@Parameter,@Seperator,@Sep) +@Sep
;WITH cteTally AS
(--==== Create a Tally CTE from 1 to whatever the length
-- of the parameter is
SELECT TOP (LEN(@Parameter))
ROW_NUMBER() OVER (ORDER BY t1.Object_ID) AS N
FROM Master.sys.All_Columns t1
CROSS JOIN Master.sys.All_Columns t2
)
INSERT into @Items
SELECT ROW_NUMBER() OVER (ORDER BY N) AS Number,
SUBSTRING(@Parameter, N+1, CHARINDEX(@Sep, @Parameter, N+1)-N-1) AS Value
, N+1
FROM cteTally
WHERE N < LEN(@Parameter)
AND SUBSTRING(@Parameter, N, 1) = @Sep --Notice how we find the seperator
Return
END
[font="Times New Roman"]-- RBarryYoung[/font], [font="Times New Roman"] (302)375-0451[/font] blog: MovingSQL.com, Twitter: @RBarryYoung[font="Arial Black"]
Proactive Performance Solutions, Inc. [/font][font="Verdana"] "Performance is our middle name."[/font]
June 19, 2008 at 1:23 pm
Cool! Thanks, Barry.
--Jeff Moden
Change is inevitable... Change for the better is not.
February 3, 2010 at 6:28 am
February 3, 2010 at 7:31 am
kraaitje (2/3/2010)
Thanks Barry, great function. I use it when generating procedures using dynamic SQL to view the output. Normally, I use PRINT @sql but the @sql variable is more then the number of characters SSMS can display. Now, I use:SELECT * FROM dbo.fnSplit1(@SQL, char(13)+char(10)) Lines
Cool! Glad I could help. Jeff had suggested to me some time ago that I should write this all up (the tricks, traps and gotchas of large-scale auto-scripting, and my solutions) as an article, might still be a good idea for me.
[font="Times New Roman"]-- RBarryYoung[/font], [font="Times New Roman"] (302)375-0451[/font] blog: MovingSQL.com, Twitter: @RBarryYoung[font="Arial Black"]
Proactive Performance Solutions, Inc. [/font][font="Verdana"] "Performance is our middle name."[/font]
February 3, 2010 at 4:37 pm
I still think it would be a great article. Lots of people run into the same problem.
--Jeff Moden
Change is inevitable... Change for the better is not.
Viewing 6 posts - 16 through 20 (of 20 total)
You must be logged in to reply to this topic. Login to reply