Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.18 KB | None | 0 0
  1. /*
  2. Splits string into parts delimitered with specified character.
  3. */
  4. CREATE FUNCTION [dbo].[SDF_SplitString]
  5. (
  6. @sString nvarchar(2048),
  7. @cDelimiter nchar(1)
  8. )
  9. RETURNS @tParts TABLE ( part nvarchar(2048) )
  10. AS
  11. BEGIN
  12. if @sString is null return
  13. declare @iStart int,
  14. @iPos int
  15. if substring( @sString, 1, 1 ) = @cDelimiter
  16. begin
  17. set @iStart = 2
  18. insert into @tParts
  19. values( null )
  20. end
  21. else
  22. set @iStart = 1
  23. while 1=1
  24. begin
  25. set @iPos = charindex( @cDelimiter, @sString, @iStart )
  26. if @iPos = 0
  27. set @iPos = len( @sString )+1
  28. if @iPos - @iStart > 0
  29. insert into @tParts
  30. values ( substring( @sString, @iStart, @iPos-@iStart ))
  31. else
  32. insert into @tParts
  33. values( null )
  34. set @iStart = @iPos+1
  35. if @iStart > len( @sString )
  36. break
  37. end
  38. RETURN
  39.  
  40. END
  41.  
  42. DECLARE @xml xml, @str varchar(100), @delimiter varchar(10)
  43. SET @str = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15'
  44. SET @delimiter = ','
  45. SET @xml = cast(('<X>'+replace(@str, @delimiter, '</X><X>')+'</X>') as xml)
  46. SELECT C.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as X(C)
  47.  
  48. DECLARE @str varchar(100), @delimiter varchar(10)
  49. SET @str = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15'
  50. SET @delimiter = ','
  51. ;WITH cte AS
  52. (
  53. SELECT 0 a, 1 b
  54. UNION ALL
  55. SELECT b, CHARINDEX(@delimiter, @str, b) + LEN(@delimiter)
  56. FROM CTE
  57. WHERE b > a
  58. )
  59. SELECT SUBSTRING(@str, a,
  60. CASE WHEN b > LEN(@delimiter)
  61. THEN b - a - LEN(@delimiter)
  62. ELSE LEN(@str) - a + 1 END) value
  63. FROM cte WHERE a > 0
  64.  
  65. SELECT TRY_CAST(value AS INT)
  66. FROM STRING_SPLIT ('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15', ',')
  67.  
  68. CREATE FUNCTION dbo.[String.Split]
  69. (
  70. @Text VARCHAR(MAX),
  71. @Delimiter VARCHAR(100),
  72. @Index INT
  73. )
  74. RETURNS VARCHAR(MAX)
  75. AS BEGIN
  76. DECLARE @A TABLE (ID INT IDENTITY, V VARCHAR(MAX));
  77. DECLARE @R VARCHAR(MAX);
  78. WITH CTE AS
  79. (
  80. SELECT 0 A, 1 B
  81. UNION ALL
  82. SELECT B, CONVERT(INT,CHARINDEX(@Delimiter, @Text, B) + LEN(@Delimiter))
  83. FROM CTE
  84. WHERE B > A
  85. )
  86. INSERT @A(V)
  87. SELECT SUBSTRING(@Text,A,CASE WHEN B > LEN(@Delimiter) THEN B-A-LEN(@Delimiter) ELSE LEN(@Text) - A + 1 END) VALUE
  88. FROM CTE WHERE A >0
  89.  
  90. SELECT @R
  91. = V
  92. FROM @A
  93. WHERE ID = @Index + 1
  94. RETURN @R
  95. END
  96.  
  97. SELECT dbo.[String.Split]('121,2,3,0',',',1) -- gives '2'
  98.  
  99. CREATE FUNCTION [dbo].[split](
  100. @delimited NVARCHAR(MAX),
  101. @delimiter NVARCHAR(100)
  102. ) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
  103. AS
  104. BEGIN
  105. DECLARE @xml XML
  106. SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
  107.  
  108. INSERT INTO @t(val)
  109. SELECT r.value('.','varchar(MAX)') as item
  110. FROM @xml.nodes('/t') as records(r)
  111. RETURN
  112. END
  113.  
  114. select * from dbo.split('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15',',')
  115.  
  116. DECLARE
  117. @InputString NVARCHAR(MAX) = 'token1,token2,token3,token4,token5'
  118. , @delimiter varchar(10) = ','
  119.  
  120. DECLARE @xml AS XML = CAST(('<X>'+REPLACE(@InputString,@delimiter ,'</X><X>')+'</X>') AS XML)
  121. SELECT C.value('.', 'varchar(10)') AS value
  122. FROM @xml.nodes('X') as X(C)
  123.  
  124. create function FnSplitToTableInt
  125. (
  126. @param nvarchar(4000)
  127. )
  128. returns table as
  129. return
  130. with Numbers(Number) as
  131. (
  132. select 1
  133. union all
  134. select Number + 1 from Numbers where Number < 4000
  135. ),
  136. Found as
  137. (
  138. select
  139. Number as PosIdx,
  140. convert(int, ltrim(rtrim(convert(nvarchar(4000),
  141. substring(@param, Number,
  142. charindex(N',' collate Latin1_General_BIN,
  143. @param + N',', Number) - Number))))) as Value
  144. from
  145. Numbers
  146. where
  147. Number <= len(@param)
  148. and substring(N',' + @param, Number, 1) = N',' collate Latin1_General_BIN
  149. )
  150. select
  151. PosIdx,
  152. case when isnumeric(Value) = 1
  153. then convert(int, Value)
  154. else convert(int, null) end as Value
  155. from
  156. Found
  157.  
  158. select * from FnSplitToTableInt
  159. (
  160. '9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ' +
  161. '9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ' +
  162. '9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ' +
  163. '9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ' +
  164. '9, 8, 7, 6, 5, 4, 3, 2, 1, 0'
  165. )
  166. option (maxrecursion 4000)
  167.  
  168. Create function [dbo].[udf_split] (
  169. @ListString nvarchar(max),
  170. @Delimiter nvarchar(1000),
  171. @IncludeEmpty bit)
  172. Returns @ListTable TABLE (ID int, ListValue nvarchar(1000))
  173. AS
  174. BEGIN
  175. Declare @CurrentPosition int, @NextPosition int, @Item nvarchar(max), @ID int, @L int
  176. Select @ID = 1,
  177. @L = len(replace(@Delimiter,' ','^')),
  178. @ListString = @ListString + @Delimiter,
  179. @CurrentPosition = 1
  180. Select @NextPosition = Charindex(@Delimiter, @ListString, @CurrentPosition)
  181. While @NextPosition > 0 Begin
  182. Set @Item = LTRIM(RTRIM(SUBSTRING(@ListString, @CurrentPosition, @NextPosition-@CurrentPosition)))
  183. If @IncludeEmpty=1 or LEN(@Item)>0 Begin
  184. Insert Into @ListTable (ID, ListValue) Values (@ID, @Item)
  185. Set @ID = @ID+1
  186. End
  187. Set @CurrentPosition = @NextPosition+@L
  188. Set @NextPosition = Charindex(@Delimiter, @ListString, @CurrentPosition)
  189. End
  190. RETURN
  191. END
  192.  
  193. SET ANSI_NULLS ON
  194. GO
  195. SET QUOTED_IDENTIFIER ON
  196. GO
  197. CREATE FUNCTION [dbo].[SplitIntoBigints]
  198. (@List varchar(MAX), @Splitter char)
  199. RETURNS TABLE
  200. AS
  201. RETURN
  202. (
  203. WITH SplittedXML AS(
  204. SELECT CAST('<v>' + REPLACE(@List, @Splitter, '</v><v>') + '</v>' AS XML) AS Splitted
  205. )
  206. SELECT x.v.value('.', 'bigint') AS Value
  207. FROM SplittedXML
  208. CROSS APPLY Splitted.nodes('//v') x(v)
  209. )
  210. GO
  211.  
  212. CREATE Function [dbo].[CsvToInt] ( @Array varchar(4000))
  213. returns @IntTable table
  214. (IntValue int)
  215. AS
  216. begin
  217. declare @separator char(1)
  218. set @separator = ','
  219. declare @separator_position int
  220. declare @array_value varchar(4000)
  221.  
  222. set @array = @array + ','
  223.  
  224. while patindex('%,%' , @array) <> 0
  225. begin
  226.  
  227. select @separator_position = patindex('%,%' , @array)
  228. select @array_value = left(@array, @separator_position - 1)
  229.  
  230. Insert @IntTable
  231. Values (Cast(@array_value as int))
  232. select @array = stuff(@array, 1, @separator_position, '')
  233. end
  234.  
  235. /* *Object: UserDefinedFunction [dbo].[Split] Script Date: 10/04/2013 18:18:38* */
  236. SET ANSI_NULLS ON
  237. GO
  238. SET QUOTED_IDENTIFIER ON
  239. GO
  240. ALTER FUNCTION [dbo].[Split]
  241. (@List varchar(8000),@SplitOn Nvarchar(5))
  242. RETURNS @RtnValue table
  243. (Id int identity(1,1),Value nvarchar(100))
  244. AS
  245. BEGIN
  246. Set @List = Replace(@List,'''','')
  247. While (Charindex(@SplitOn,@List)>0)
  248. Begin
  249.  
  250. Insert Into @RtnValue (value)
  251. Select
  252. Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
  253.  
  254. Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
  255. End
  256.  
  257. Insert Into @RtnValue (Value)
  258. Select Value = ltrim(rtrim(@List))
  259.  
  260. Return
  261. END
  262. go
  263.  
  264. Select *
  265. From [Clv].[Split] ('1,2,3,3,3,3,',',')
  266. GO
  267.  
  268. CREATE FUNCTION Split
  269. (
  270. @delimited nvarchar(max),
  271. @delimiter nvarchar(100)
  272. ) RETURNS @t TABLE
  273. (
  274. -- Id column can be commented out, not required for sql splitting string
  275. id int identity(1,1), -- I use this column for numbering splitted parts
  276. val nvarchar(max)
  277. )
  278. AS
  279. BEGIN
  280. declare @xml xml
  281. set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'
  282.  
  283. insert into @t(val)
  284. select
  285. r.value('.','varchar(max)') as item
  286. from @xml.nodes('//root/r') as records(r)
  287.  
  288. RETURN
  289. END
  290. GO
  291.  
  292. Select * from dbo.Split(N'1,2,3,4,6',',')
  293.  
  294. CREATE FUNCTION [dbo].[DelimitedSplit8K]
  295. (@pString VARCHAR(8000), @pDelimiter CHAR(1))
  296. RETURNS TABLE WITH SCHEMABINDING AS
  297. RETURN
  298. --===== "Inline" CTE Driven "Tally Table" produces values from 0 up to 10,000...
  299. -- enough to cover NVARCHAR(4000)
  300. WITH E1(N) AS (
  301. SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
  302. SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
  303. SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
  304. ), --10E+1 or 10 rows
  305. E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
  306. E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
  307. cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front
  308. -- for both a performance gain and prevention of accidental "overruns"
  309. SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
  310. ),
  311. cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
  312. SELECT 1 UNION ALL
  313. SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
  314. ),
  315. cteLen(N1,L1) AS(--==== Return start and length (for use in substring)
  316. SELECT s.N1,
  317. ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
  318. FROM cteStart s
  319. )
  320. --===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
  321. SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
  322. Item = SUBSTRING(@pString, l.N1, l.L1)
  323. FROM cteLen l
  324. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement