使用Substring返回sql中的部分文本

时间:2013-11-26 04:28:18

标签: sql sql-server

我试图在我的存储过程中的“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”,然后继续返回过程的名称。这对我来说非常具有挑战性。

1 个答案:

答案 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

注意:对于某些情况,文本字段左侧会有空白区域,您需要修剪它才能正常工作。在某些情况下,表名也没有大括号(“[”和“]”),所以你应该相应地改变它。