我的数据库(即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
我需要得到这个结果,我无法继续前进。给我启发。
谢谢
答案 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