Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有办法按列名搜索所有SQL表?_Sql Server_Ssms - Fatal编程技术网

Sql server 有没有办法按列名搜索所有SQL表?

Sql server 有没有办法按列名搜索所有SQL表?,sql-server,ssms,Sql Server,Ssms,作为回答,您可以按列名在所有表中搜索列 假设我有如下列的列表: DECLARE @columnNames TABLE (Id varchar(30)) INSERT INTO @columnNames VALUES ('xColumn1Name'), ('xColumn2Name'), ('xColumn3Name') 我想找到至少有这三列的所有表。是否可以使用下面的代码执行foreach循环,或者有更简单的方法 SELECT COLUMN_NAME AS 'Colum

作为回答,您可以按列名在所有表中搜索列

假设我有如下列的列表:

DECLARE @columnNames TABLE (Id varchar(30))

INSERT INTO @columnNames 
VALUES ('xColumn1Name'), ('xColumn2Name'), ('xColumn3Name')
我想找到至少有这三列的所有表。是否可以使用下面的代码执行foreach循环,或者有更简单的方法

SELECT      
    COLUMN_NAME AS 'ColumnName',  -- this code will get all tables with a column by name @xColumnName, but I would like to pass in a list
    TABLE_NAME AS 'TableName'
FROM        
    INFORMATION_SCHEMA.COLUMNS
WHERE       
    COLUMN_NAME LIKE '@xColumnName'
ORDER BY    
    TableName, ColumnName;

该表必须在列表中包含所有3列的名称,如果我可以筛选出没有特定列或列列表的表,那就太酷了。这应该达到您的初始目标

SELECT 
    [TableName]
FROM (
    SELECT      
        COLUMN_NAME AS 'ColumnName',  -- this code will get all tables with a column by name @xColumnName, but I would like to pass in a list
        TABLE_NAME AS 'TableName',
        ROW_NUMBER() OVER(PARTITION BY TABLE_NAME ORDER BY COLUMN_NAME) rn
    FROM        
        INFORMATION_SCHEMA.COLUMNS
    WHERE       
        COLUMN_NAME IN ('xColumn1Name', 'xColumn2Name', 'xColumn3Name')
) a
WHERE rn >= 3
为了简短的解释,此查询将通过信息模式查找表中的任何这些列。然后,行号基本上按表对列进行分组。如果有3个或更多结果,则所有3列都在那里


由于它是一个子选择,如果需要,您还可以筛选特定列的外部选择。

这应该可以实现您的初始目标

SELECT 
    [TableName]
FROM (
    SELECT      
        COLUMN_NAME AS 'ColumnName',  -- this code will get all tables with a column by name @xColumnName, but I would like to pass in a list
        TABLE_NAME AS 'TableName',
        ROW_NUMBER() OVER(PARTITION BY TABLE_NAME ORDER BY COLUMN_NAME) rn
    FROM        
        INFORMATION_SCHEMA.COLUMNS
    WHERE       
        COLUMN_NAME IN ('xColumn1Name', 'xColumn2Name', 'xColumn3Name')
) a
WHERE rn >= 3
为了简短的解释,此查询将通过信息模式查找表中的任何这些列。然后,行号基本上按表对列进行分组。如果有3个或更多结果,则所有3列都在那里


由于它是一个子选择,如果需要,还可以为特定列筛选外部选择。

这是一个关系划分问题。正如乔·塞尔科所说,有几种方法可以解决这个问题。常见的解决方案如下:

声明@columnNames表Id varchar30 插入到@columnNames中 值“xColumn1Name”、“xColumn2Name”、“xColumn3Name” 选择t.name 从sys.t表 在c.object\u id=t.object\u id上连接sys.c列 在cn.Id=c.name上加入@columnNames cn 按t.object\u id、t.name分组 有计数*>= 从@columnNames中选择count*;
这意味着:给我所有的表,其中与list@columnName匹配的列数与该列表中的列数相同或更多,换句话说,tehre是每个列的匹配项。

这是一个关系划分问题。正如乔·塞尔科所说,有几种方法可以解决这个问题。常见的解决方案如下:

声明@columnNames表Id varchar30 插入到@columnNames中 值“xColumn1Name”、“xColumn2Name”、“xColumn3Name” 选择t.name 从sys.t表 在c.object\u id=t.object\u id上连接sys.c列 在cn.Id=c.name上加入@columnNames cn 按t.object\u id、t.name分组 有计数*>= 从@columnNames中选择count*;
这意味着:给我所有的表,其中与list@columnName匹配的列数与该列表中的列数相同或更多,换句话说,tehre是每个列的匹配项。

您可以使用INTERSECT组合不同的结果集。这将给出所有结果集中的记录,因此在本例中,表包含所有三列

SELECT OBJECT_NAME(object_id) AS Table
FROM sys.columns
WHERE name = 'xColumn1Name'
INTERSECT
SELECT OBJECT_NAME(object_id) AS Table
FROM sys.columns
WHERE name = 'xColumn3Name'
INTERSECT
SELECT OBJECT_NAME(object_id) AS Table
FROM sys.columns
WHERE name = 'xColumn3Name'

可以使用INTERSECT组合不同的结果集。这将给出所有结果集中的记录,因此在本例中,表包含所有三列

SELECT OBJECT_NAME(object_id) AS Table
FROM sys.columns
WHERE name = 'xColumn1Name'
INTERSECT
SELECT OBJECT_NAME(object_id) AS Table
FROM sys.columns
WHERE name = 'xColumn3Name'
INTERSECT
SELECT OBJECT_NAME(object_id) AS Table
FROM sys.columns
WHERE name = 'xColumn3Name'

为了澄清,您想要的是包含所有三个值的表还是这三个值中的任何一个?表必须包含所有3个值,或者在listRelational division问题中包含多少值,以防有人怀疑。为了澄清,您想要的表是全部有三个值还是这三个值中的任何一个?表必须全部有三个值,或者不管列表关系划分问题中有多少值,以防有人想知道。对于未知的列数,您将如何对其进行参数化?这取决于列表的来源。最简单的方法是将“xColumn1Name”、“xColumn2Name”、“xColumn3Name”中的列_名称替换为ColumnNames表中的SELECT columns中的列_名称。对于未知的列数,您将如何对其进行参数化?取决于该列表的来源。最简单的方法是将“xColumn1Name”、“xColumn2Name”、“xColumn3Name”中的列_名称替换为TableOfColumnNames中选择的列_名称,该列不可伸缩,不可伸缩