如何从SQL Server中的文本中提取所有文字字符串?

时间:2015-10-23 12:57:33

标签: sql-server string

我需要从SQL服务器存储过程中提取所有文字字符串并将它们放在表中。我试图使用Jeff Moden's和其他字符串拆分器,但引用字符串之间的所有代码都会妨碍并且难以识别为无用。我想要完成的最简单的例子:

input =“SELECT * FROM table WHERE列IN('cool','super','awesome')

输出表:

  • 很酷
  • super
  • 真棒

以下是使用sp_help存储过程的示例。

/

我希望输出只是sp_help中包含的单引号项 - 这里是sp_help的片段。

*?

输出将是一个表:   - 不   - 是的  - 没有  - 名称   - 所有者   - 所有者   - Object_type   - O9T

是否有人已经有这样的事情或者可以调整其中一个常见的字符串分割器来忽略对立引用项目之间的东西?

1 个答案:

答案 0 :(得分:1)

这是我做的一个小测试。 find_next函数是charindex的替代品。不同之处在于,当它看到字符串的结尾时,它将跳过''以防止结束字符串。如果发生这种情况,它将递归调用自己:

CREATE FUNCTION find_next (@str nvarchar(MAX), @start int, @mode int)
returns bigint
as
begin
  declare @pos int
  set @pos = charindex('''', @str, @start)
  if (@pos = 0) return 0
  if (@mode = 1) return @pos
  if (substring(@str, @pos+1,1)='''') return dbo.find_next(@str, @start+2, @mode)
  return @pos
end

一个基于CTE的递归函数来查找字符串:

CREATE FUNCTION find_strs (@str nvarchar(MAX))
RETURNS TABLE AS
RETURN 
  WITH CTE AS (
     select 
         convert(bigint, 1) as start, 
         charindex('''', @str) as stop,
         0 as type
     UNION ALL
     select 
         stop + 1, 
         dbo.find_next(@str, stop + 1, type), 
         (type + 1) % 2 
     FROM CTE
     WHERE  stop > 0
   )
   SELECT substring(@str, start, CASE WHEN stop > 0 THEN stop - start ELSE 0 END) as Str
   FROM   CTE
   WHERE  stop > 0 and type = 1

SQL Fiddle

中的简单示例