我需要如何在表格中查找完全匹配的内容

时间:2018-10-12 09:11:16

标签: sql sql-server tsql

我的数据库(即Dbo.tables)中有一个类似SYS.OBJECTS表的表,

样本数据

Tbl_name    Col_names   Query
H_Website   Website_ID  SELECT W.WebSiteID, C.Channel_ID FROM   Enroll W LEFT JOIN CHANNEL_TYPE C ON W.ChannelNAME = C.ChannelNAME

如果我执行查询列中的查询,我将从注册表中获取网站ID。因此,实际上,注册表具有“网站ID”列。 如何在“查询”列中查找网站ID并获取表名(注册具有“网站ID”列名的表)

我需要得到的输出

Tbl_name   Col_names   Source_Tbl
H_Website  Website_ID   Enroll

我需要得到这个结果,我无法继续前进。给我启发。

谢谢

2 个答案:

答案 0 :(得分:0)

use test_db

SELECT      t.name AS 'TableName'
            ,c.name  AS 'ColumnName'

FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id

where   t.name like '%tbl_name%'

ORDER BY    TableName
            ,ColumnName;

答案 1 :(得分:0)

这可能是一件痛苦的事情,因为SQL没有正则表达式(表达式)的完全支持。因此,在具有这种复杂性的字符串中进行搜索将非常困难。我认为它很复杂的原因是,您只提供了一个简单的查询。虽然有窗口查询,CTE,循环...等。因此,您需要提出一种不同且最简单的方法。否则,将是漫长的旅程!

这是一个将应用于您的示例的示例(适用于仅包含一个FROM的简单查询):

DECLARE     
    @t  TABLE(Tbl_name VARCHAR(250), Col_names VARCHAR(250), Query VARCHAR(MAX) )
INSERT INTO @t VALUES
('H_Website','Website_ID','SELECT W.WebSiteID, C.Channel_ID FROM Enroll W LEFT JOIN CHANNEL_TYPE C ON W.ChannelNAME = C.ChannelNAME')



SELECT  
    Tbl_name
,   Col_names
,   RTRIM(LTRIM(LEFT(SecondPart, CHARINDEX(' ', SecondPart)))) Source_Tbl
FROM (
    SELECT *,
        LTRIM(SUBSTRING(FirstPart, CHARINDEX(' ', FirstPart) , LEN(FirstPart) )) SecondPart
    FROM (
        SELECT 
            Tbl_name
        ,   Col_names
        ,   LTRIM(SUBSTRING(Query,CHARINDEX(' FROM ',Query), 50 )) FirstPart
        FROM @t
    ) D
) C