我试图在我的存储过程中的“FROM”之后返回一个跟在表名后面的单词。我正在使用如下的子字符串函数。
SELECT
SUBSTRING(text,CHARINDEX('FROM',text)+8, CHARINDEX('with',text,9)+10) AS [nolock],
name,
type
FROM
Volare_2005.sys.sysobjects so with (nolock)
INNER JOIN
Volare_2005.sys.syscomments sc with (nolock)
ON so.id=sc.id where type='p'
我很清楚表名超过任何“FROM”,因此试图返回表名后面的内容。它可以是“with”或“INNER”等。上面的查询有一些问题因为,表名长度不一,我不知道该怎么做。此外,我是这个子串函数的新手,只是了解它。任何帮助或替代方案将不胜感激。
其他信息。我试图比较存储过程文本中的表名后面的单词,并确定它是否“with”,然后继续返回过程的名称。这对我来说非常具有挑战性。
答案 0 :(得分:1)
根据您的要求,使用PATINDEX()或CHARINDEX()函数检查表名的字符串非常困难,但您可以这样做:
SELECT CASE CHARINDEX(']',RIGHT(text,LEN(text)-25), PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 11)
WHEN 0 THEN SUBSTRING(RIGHT(text,LEN(text)-25), PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 10, CHARINDEX(' ',RIGHT(text,LEN(text)-25), PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 11)- (PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 10))
ELSE SUBSTRING(RIGHT(text,LEN(text)-25), PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 11, CHARINDEX(']',RIGHT(text,LEN(text)-25), PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 11)- (PATINDEX('%FROM__dbo__%',RIGHT(text,LEN(text)-25)) + 10)) END AS [nolock],
name,
type, text
FROM sys.sysobjects so with (nolock) INNER JOIN sys.syscomments sc with (nolock) ON so.id=sc.id
where type='p'
and PATINDEX('%FROM__dbo__%',text) > 0
UNION
SELECT CASE CHARINDEX(']',RIGHT(text,LEN(text)-25), PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 11)
WHEN 0 THEN SUBSTRING(RIGHT(text,LEN(text)-25), PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 10, CHARINDEX(' ',RIGHT(text,LEN(text)-25), PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 11) - (PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 10))
ELSE SUBSTRING(RIGHT(text,LEN(text)-25), PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 11, CHARINDEX(']',RIGHT(text,LEN(text)-25), PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 11) - (PATINDEX('%JOIN__dbo__%',RIGHT(text,LEN(text)-25)) + 10)) END AS [nolock],
name,
type, text
FROM sys.sysobjects so with (nolock) INNER JOIN sys.syscomments sc with (nolock) ON so.id=sc.id
where type='p'
and PATINDEX('%JOIN__dbo__%',text) > 0
注意:对于某些情况,文本字段左侧会有空白区域,您需要修剪它才能正常工作。在某些情况下,表名也没有大括号(“[”和“]”),所以你应该相应地改变它。