我正在尝试使用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',有时候我得到了我想要的名字的一部分,有时候根据表名的长度,我只得到名字的第一部分,最后一部分名称被截断。无论如何要做到这一点,还是有更好的写作方式?任何帮助将不胜感激。提前致谢。
答案 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'