我需要从SQL服务器存储过程中提取所有文字字符串并将它们放在表中。我试图使用Jeff Moden's和其他字符串拆分器,但引用字符串之间的所有代码都会妨碍并且难以识别为无用。我想要完成的最简单的例子:
input =“SELECT * FROM table WHERE列IN('cool','super','awesome')
输出表:
以下是使用sp_help存储过程的示例。
/
我希望输出只是sp_help中包含的单引号项 - 这里是sp_help的片段。
*?
输出将是一个表: - 不 - 是的 - 没有 - 名称 - 所有者 - 所有者 - Object_type - O9T
是否有人已经有这样的事情或者可以调整其中一个常见的字符串分割器来忽略对立引用项目之间的东西?
答案 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
中的简单示例