SQL Server:在所有表中搜索列中具有特定值的所有行

bbuxkriu  于 2022-11-21  发布在  SQL Server
关注(0)|答案(2)|浏览(184)

(我在StackOverflow上看到过其他几篇关于此问题的文章--特别是this和this,但它们似乎都是Oracle特有的,而且我使用的是SQL Server。)
所以我使用this post来获取所有包含特定列的表。这部分工作得很好,它返回了100多个表。这就是我在那篇文章中使用的方法:

SELECT      c.name  AS 'ColumnName'
            ,t.name AS 'TableName'
FROM        sys.columns c
JOIN        sys.tables  t   ON c.object_id = t.object_id
WHERE       c.name LIKE 'myColumn'
ORDER BY    TableName
            ,ColumnName;

我现在需要的是对它的修改--是否有一种方法可以获取目标列名具有特定值的每个表中的所有行?基本上,我希望能够遍历系统中的每个表,并选择特定列名具有特定值的每一行。(我稍后会尝试删除所有这些行,但先删除SELECT,再删除DELETE。)
一些沿着的东西(我知道这是行不通的;这是为了说明的目的):

SELECT [row]
    FROM sys.tables tab
    JOIN sys.columns col ON col.object_id = tab.object_id
    WHERE col.name LIKE 'myColumn' AND col.value = 'myVal'

我能想到的唯一其他选项是获取第一个查询的输出,并对每个查询运行SELECT,至少可以说,这会在SQL Server Management Studio中给予笨拙的输出。
有没有一种简单的方法来实现这一点,而不诉诸外部工具或诸如此类的东西?

z9ju0rcb

z9ju0rcb1#

使用INFORMATION_SCHEMA目录。

SELECT TABLE_CATALOG, TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%SOME_TEXT%'
ORDER BY TABLE_CATALOG, TABLE_NAME, COLUMN_NAME

请在此处查看:http://rextester.com/JPEZN41582

6yjfywim

6yjfywim2#

下面是我用来查找包含特定列名的特定值的所有表的内容

DECLARE @TableName varchar(250);
DECLARE @ColumnName varchar(250);
DECLARE @SearchValue varchar(250) = 'MyValue';
DECLARE @SearchColumn varchar(250)  = '%MyColumnName%';
DECLARE @SQLQuery AS NVARCHAR(500);

CREATE TABLE #TempTable(
TableName varchar(250),
ColumnName varchar(250),
)

DECLARE CUR_TEST CURSOR FAST_FORWARD FOR
    SELECT     t.name AS 'TableName', c.name as col_name
    FROM        sys.columns c
    JOIN        sys.tables  t   ON c.object_id = t.object_id
    WHERE       c.name LIKE @SearchColumn
    ORDER BY    TableName;

OPEN CUR_TEST
FETCH NEXT FROM CUR_TEST INTO @TableName, @ColumnName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLQuery = 'insert into #TempTable(TableName, ColumnName) 
    select DISTINCT ''' + @TableName + ''', ''' + @ColumnName + ''' from ' + @TableName + ' WHERE ' + @ColumnName + ' = ''' + @SearchValue + ''''

    EXECUTE sp_executesql @SQLQuery

   FETCH NEXT FROM CUR_TEST INTO @TableName, @ColumnName
END
CLOSE CUR_TEST
DEALLOCATE CUR_TEST
GO

select * from #TempTable
Drop Table #TempTable

相关问题