首页 > 解决方案 > 使用 Substring 或任何其他函数准确地选择一个字符串

问题描述

我在编写查询以选择字符串时被打动了。我发布的查询是示例数据

Declare @tbl table (tblname varchar(20),Query VARCHAR(MAX))

Insert into @tbl (tblname,Query)  values ('Employee','select EmpId, 
            (Select top 1 Dept_ID from Stg.Dept 
                    where Deptid = Deptid) Dept_ID,
            (Select top 1 Dept_ID from Stg.Sub_dept 
                    where Deptid = D.Deptid) SubDept_ID
            from stg.Employee E
            left join stg.Dept D 
                ON D.EMPID = E.EmpID
              WHERE EMPID = (Select EMPID from stg.dept where Deptid = Deptid)')

查询

select tblname,SUBSTRING(LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))),
CHARINDEX('.', LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))))+1,
CHARINDEX(' ',
SUBSTRING(LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))),
CHARINDEX('.', LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))))+1, LEN(Query)))-1) from 
@tbl

结果

tblname   Req_tbl
Employee    Dept

实际上,此查询是从该查询列中的子查询中选择stg.Dept表名。我真正想要的是拿起主表stg.Employee表。

输出

tblname    Req_tbl
Employee    Employee

你能就此提出建议吗

标签: sqlsql-servertsql

解决方案


这不是 100% 清楚,但您尝试做的似乎是解析查询以确定是 @tbl.tblname 定义的对象。存在于带有 FROM 子句的查询中。例如 - 对于“员工”,您正在寻找“stg.employee”(不包括架构)。

如果我理解正确,您可以使用DelimitedSplit8K之类的拆分器轻松完成此操作,并执行以下操作:

Declare @tbl table (tblname varchar(20),Query VARCHAR(MAX))

Insert into @tbl (tblname,Query)  values ('Employee','select EmpId, 
            (Select top 1 Dept_ID from Stg.Dept 
                    where Deptid = Deptid) Dept_ID,
            (Select top 1 Dept_ID from Stg.Sub_dept 
                    where Deptid = D.Deptid) SubDept_ID
            from stg.Employee E
            left join stg.Dept D 
                ON D.EMPID = E.EmpID
              WHERE EMPID = (Select EMPID from stg.dept where Deptid = Deptid)')

SELECT TOP (1) t.tblname, req_table = t.tblname
FROM    @tbl AS t
CROSS APPLY dbo.delimitedSplit8K(t.Query,CHAR(10)) AS s
WHERE PATINDEX('%[^a-zA-Z]from %'+t.tblname+'%', s.item) > 0;

然而,这里的问题在于,取决于您的 T-SQL 代码的统一程度——这可能会变得复杂而棘手。


推荐阅读