使用子字符串或任何其他函数精确地选择字符串



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

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。该查询列中子查询的部门表名称。我真正想要的是拿起stg。员工表,即主表。

输出

tblname    Req_tbl
Employee    Employee

你能建议一下吗

这不是 100% 清楚的,但您尝试执行的操作似乎是解析查询以确定是否由 @tbl.tblname 定义的对象。 存在于该查询中,其中包含 FROM 子句。例如 - 对于"员工",您正在寻找"stg.employee"(不包括架构(。

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

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代码的统一程度,这可能会变得复杂和毛茸茸。

最新更新