在SQL中提取两个字符之间的文本

时间:2014-02-24 20:12:48

标签: sql tsql

我正在尝试使用t-sql在两个字符之间提取文本。我已经能够将信息写入接近我想要的信息,但出于某种原因,我没有得到我所期待的(惊讶,惊讶)。真的可以用它来帮助改进它。我试图提取位于两个[]之间的部分表名。列数据的示例如下(这是一个记录对数据库所做的所有更改的表,因此列文本基本上是SQL语句):

ALTER TABLE [TABLENAME].[MYTABLE] ADD
[VIP_CUSTOMER] [int] NULL

我正在尝试提取部分表名,在这个例子中我只想要'MYTABLE'

现在我正在使用:

select  SUBSTRING(db.Event_Text, CHARINDEX('.', db.Event_Text) + 2, (CHARINDEX(']', db.Event_Text)) - CHARINDEX('', db.Event_Text) + Len(']')) as OBJName
FROM DBA_AUDIT_EVENT DB
WHERE DATABASE_NAME = 'XYZ'

但是当我使用它时,我并不总是得到所需的结果。有时候我会得到'MYTABLE] ADD',有时候我得到了我想要的名字的一部分,有时候根据表名的长度,我只得到名字的第一部分,最后一部分名称被截断。无论如何要做到这一点,还是有更好的写作方式?任何帮助将不胜感激。提前致谢。

3 个答案:

答案 0 :(得分:3)

很长,但这是使用括号的公式:

Declare @text varchar(200);
Select @text='ALTER TABLE [TABLENAME].[MYTABLE] ADD [VIP_CUSTOMER] [int] NULL';
Select SUBSTRING(@text, 
                 CHARINDEX('[', @text, CHARINDEX('[', @text) + 1 ) +1, 
                 CHARINDEX(']', @text, CHARINDEX('[', @text, CHARINDEX('[', @text) + 1 ) ) -
                    CHARINDEX('[', @text, CHARINDEX('[', @text) + 1 ) - 1 );

将@text替换为您的列名。

答案 1 :(得分:0)

这是获得长度的一种非常难看的方式,但我之前使用过类似的东西:

select  SUBSTRING(db.Event_Text, 
    CHARINDEX('.', db.Event_Text) + 2,  
    charindex('] ADD',db.Event_Text) - CHARINDEX('.',db.Event_Text)-2))

试一试,它可能适合你。

答案 2 :(得分:0)

试一试:

select SUBSTRING(db.Event_Text, CHARINDEX('.', db.Event_Text) + 2
, CHARINDEX(']', db.Event_Text) - 2) as OBJName
FROM DBA_AUDIT_EVENT DB
WHERE DATABASE_NAME = 'XYZ'

select SUBSTRING(db.Event_Text, CHARINDEX('.', db.Event_Text) + 2 , CHARINDEX(']', db.Event_Text) - 2) as OBJName FROM DBA_AUDIT_EVENT DB WHERE DATABASE_NAME = 'XYZ'