查找SQL查询中的子句标准

时间:2017-01-04 13:08:13

标签: sql sql-server tsql

我有一个表有3个不同的选择查询。

e.g。

              Staff
              ------------------------------------------------------------
              ID   Code   Name   Phone  DOB   Email   Addr1   Addr2  Addr3


    Query1
    Select ID, Code, Phone From Staff Where Code = 'ABC'

    Query2
    Select ID, Code, Phone From Staff Where Name = 'ABCXYZ' And Code = 'B'

    Query3
    Select ID, Code, Phone From Staff Where Phone= '1234' And Email = 'a@b'     

这3个查询存在于3个不同的存储过程中。

我想找到我在所有Where子句中使用的属性的名称。但是想要自动化,因为我有超过100个表要查找

像这样的东西

             exec fxGetWhereColList ('Staff');

结果:

                Code
                Name
                Phone
                Email

2 个答案:

答案 0 :(得分:0)

就像Lamak所说,这样做几乎是不可能的,至少在SQL中是这样。

要正确执行此操作,您应该对正在使用的SQL变体使用SQL Parser。 SQL解析器将标识语句中引用的对象以及where子句的元素。

但是如果您知道查询很简单并且看起来与您列出的查询类似,那么您可以使用一些简单的查询来分离语句。我为一个声明做了一个例子:

declare 
    @foo nvarchar(max)=N'Select ID, Code, Phone From Staff Where Phone= ''1234'' And Email = ''a@b''     '
    , @From nvarchar(max)=' From '
    , @Table nvarchar(max)
declare @a int

-- find FROM
set @a= PATINDEX('%'+@From+'%',@foo) 
-- Find statement to the right of from
set @foo=ltrim(RIGHT(@foo,len(@foo)-(@a))) 
-- Find first space
set @a=CHARINDEX(' ',@foo) 
-- find first word, we assume it is the table name
set @Table=ltrim(rtrim(LEFT(@foo,@a))) 
-- Find WHERE statement
set @foo=ltrim(rtrim(replace(right(@foo,len(@foo)-@a),'Where','')))

-- Now find matching columns in table, I am using SQL Server so I look up column names in information_schema.columns
select @Table,column_name 
from INFORMATION_SCHEMA.COLUMNS
--from (values ('ID'),('Code'),('Name'),('Phone'),('DOB'),('Email'),('Addr1'),('Addr2'),('Addr3'))cols(column_name) 
where TABLE_NAME=@table
and @foo like '%'+column_name+'%'

这个解决方案只适用于一些简单的语句,它假定了很多东西。

答案 1 :(得分:0)

我之前同意所有帖子,这是一个复杂的案例。

我给你一个小小的想法,帮助你完成工作。 如果您可以检索每个执行计划,则可以解析XML结果并获取受影响的列。

例如:在节点< Predicate>

Execution Plan