This explanation is copied from stackoverflow.com to understand the differences of using SQL Functions.Functions are computed values and cannot perform permanent environmental changes to SQL Server (i.e. no INSERT or UPDATE statements allowed).A Function can be used inline in SQL Statements if it returns a scalar value or can be joined upon if it returns a result set.
So let's get to the headline. Yes we sometimes need to pass a list of values and get them split from a given delimiter. Especially we can use such function to join with other queries to do the job easier and faster. Look at the following.
To do so, first we maintain a sequence table that has sequential numbers starting from 1.
CREATE TABLE tblSequence (
[id] [int] NOT NULL
) ON [PRIMARY]
GO
And now let's add some sequential numbers to it. For the moment we assume the max would be 8000.
Declare @i int
Select @i = 1
While @i <= 8000
Begin
insert into tblSequence(id) values (@i)
if @@error <> 0 Break
Select @i = @i + 1
End
go
It's time to use this table and create our function.
CREATE FUNCTION tblListSplit(@ListId varchar(8000),@d char(1))
RETURNS TABLE
AS
RETURN (
SELECT
row_number() OVER(ORDER BY id) id,
NullIf(rtrim(ltrim(SubString(@d + @ListId + @d, id, CharIndex(@d, @d + @ListId + @d, id) - id))), '') Val
FROM tblSequence (NOLOCK)
WHERE id <= Len(@d + @ListId + @d)
AND SubString(@d + @ListId + @d, id - 1, 1) = @d
AND CharIndex(@d, @d + @ListId + @d, id) - id > 0
)
GO
Now the function is ready to serve us as needed. Let's try it.
select * from tblListSplit('1,2,3,4,5,6,7,8,9,10',',')
And the result will be like;
So, you can see the list is split according to the delimiter we pass and here we used a comma. Try it with all your needs in your procedures.
Happy Coding..!!!
No comments:
Post a Comment