经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
展开中断或忽略的序号
来源:cnblogs  作者:Insus.NET  时间:2019/5/28 9:08:03  对本文有异议

网上有人问:

declare @WH varchar(MAX)
set @WH='C1,C2,C3-C9,C20,C22,C30-C35'

想要循环截取出含有-的字符串 C3-C9,C30-C35,展开C3-C9,C30-C35,
将@WH替换为 'C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35'

Insus.NET也想练习一下。

写一个自定义函数来处理需要展开的字符串:

 

 

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5.  
  6. -- =============================================
  7. -- Author: Insus.NET
  8. -- Create date: 2019-05-27
  9. -- Update date: 2019-05-27
  10. -- Description: 填充中断的字符串
  11. -- =============================================
  12. CREATE FUNCTION [dbo].[svf_FillConnectionString]
  13. (
  14. @string NVARCHAR(MAX)
  15. )
  16. RETURNS NVARCHAR(MAX)
  17. AS
  18. BEGIN
  19. DECLARE @rtv NVARCHAR(MAX) = N''
  20.  
  21. DECLARE @hyphen VARCHAR(1) = N'-'
  22. IF @string LIKE '%'+ @hyphen +'%'
  23. BEGIN
  24. DECLARE @hyphen_position INT = CHARINDEX(@hyphen, @string)
  25. DECLARE @Front NVARCHAR(40) = SUBSTRING(@string, 1, @hyphen_position - 1)
  26. DECLARE @Back NVARCHAR(40) = SUBSTRING(@string, @hyphen_position + 1, LEN(@string)- @hyphen_position)
  27. DECLARE @f INT = CAST(SUBSTRING(@Front, 2, LEN(@Front) - 1) AS INT)
  28. DECLARE @b INT = CAST(SUBSTRING(@Back, 2, LEN(@Back) - 1) AS INT)
  29. WHILE @f <= @b
  30. BEGIN
  31. SET @rtv = @rtv + N',' + N'C' + CAST(@f AS NVARCHAR(MAX))
  32. SET @f = @f + 1
  33. END
  34. END
  35. RETURN CASE WHEN LEN(ISNULL(@rtv,N'')) = 0 THEN @string ELSE STUFF(@rtv,1,1,N'') END
  36. END
Source Code

 

另一个自定义函数:

把字符串转换为表:

 

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5.  
  6. -- =============================================
  7. -- Author: Insus.NET
  8. -- Create date: 2019-05-27
  9. -- Update date: 2019-05-27
  10. -- Description: 拆分字符串转为表
  11. -- =============================================
  12. CREATE FUNCTION [dbo].[tvf_ConvertStringToTable]
  13. (
  14. @OriginalString NVARCHAR(MAX),
  15. @Delimiter CHAR(1)
  16. )
  17. RETURNS @Result TABLE ([value] NVARCHAR(MAX))
  18. AS
  19. BEGIN
  20. DECLARE @xml XML = CAST('<insus>' + REPLACE(@OriginalString,@Delimiter,'</insus><insus>') + '</insus>' AS XML)
  21. INSERT INTO @Result([value]) SELECT n.value('.','NVARCHAR(MAX)') AS w
  22. FROM @xml.nodes('/insus') AS E(n)
  23. RETURN
  24. END
  25. GO
Source Code

 

现在试使用上面2个函数,看看结果如何?

 

  1. DECLARE @WH VARCHAR(MAX)
  2. SET @WH='C1,C2,C3-C9,C20,C22,C30-C35'
  3. ;WITH HW AS
  4. (
  5. SELECT [value] FROM [dbo].[tvf_ConvertStringToTable](@WH,',')
  6. )
  7. SELECT [value],[dbo].[svf_FillConnectionString]([value]) as [str] FROM HW
Source Code


差不多接近要求了,现在只要把[str]这列的数据连接起来就OK了。

如何连接,参考这篇《列值转换为逗号分隔字符串https://www.cnblogs.com/insus/p/10852906.html

 

  1. DECLARE @ok_string NVARCHAR(MAX)
  2. DECLARE @WH VARCHAR(MAX)
  3. SET @WH='C1,C2,C3-C9,C20,C22,C30-C35'
  4. ;WITH HW AS
  5. (
  6. SELECT [value] FROM [dbo].[tvf_ConvertStringToTable](@WH,',')
  7. )
  8. --SELECT [value],[dbo].[svf_FillConnectionString]([value]) as [str] FROM HW
  9.  
  10. SELECT @ok_string = ISNULL(@ok_string + ',', '') + [dbo].[svf_FillConnectionString]([value]) FROM HW
  11. SELECT @ok_string
Source Code

 

大功告成!

 

原文链接:http://www.cnblogs.com/insus/p/10929956.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号