当该列包含特定值时,如何从具有特定命名列的表中进行选择?

时间:2017-07-06 18:32:32

标签: sql sql-server

我正在尝试选择具有相同列的所有表,并且该列中的实例与我指定的字符串格式匹配。

例如,

表1:

FirstName,LastName,ID

表2:

ID,值

表3:

FirstName,Value

我希望我的结果显示包含ID的表,其中ID以字符'a'

开头

到目前为止,我所拥有的是

    SELECT SYS.TABLES.NAME FROM SYS.TABLES
    INNER JOIN SYS.COLUMNS
    ON SYS.TABLES.OBJECT_ID = SYS.COLUMS.OBJECT_ID
    WHERE SYS.COLUMS.NAME = 'ID'

然后我不知道如何继续。任何帮助表示赞赏:)

3 个答案:

答案 0 :(得分:1)

此代码经过测试且有效:

创建一个游标,选择其中列= ID的所有表/列名称(我们不需要列变量,因为您只定位'ID',但我包含它以防您或其他人需要更多功能)。

存储了这些信息后,您可以遍历游标并执行动态SQL。请注意,这很容易受到SQL注入的影响,就像几乎所有动态SQL一样。

这种方法将为每个具有列ID的表提供单独的数据表 - 即使没有符合条件的ID列(您只需为这些列获取空白数据表)。

此外,您可以根据需要更改变量的大小。

如果您需要任何澄清或修改,请与我们联系。

 DECLARE @TableName varchar(255), @ColumnName varchar(255), @SQL varchar(1000)

 DECLARE TempCursor CURSOR FOR
 SELECT T.[name] AS [TableName], C.[name] AS [ColumnName] 
 FROM sys.tables T 
 JOIN sys.columns C 
    ON T.object_id = C.object_id 
 WHERE C.[name] = 'ID' 


 OPEN TempCursor
 FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName
 WHILE @@FETCH_STATUS = 0
    BEGIN       

        SET @SQL = 'SELECT * FROM ' + @TableName
        SET @SQL = @SQL + ' WHERE ' + @ColumnName + ' like ''a%'''
        EXECUTE (@SQL)

        FETCH NEXT FROM TempCursor INTO @TableName, @ColumnName

    END

CLOSE TempCursor
DEALLOCATE TempCursor

答案 1 :(得分:0)

您可以使用“LIKE”从“a”开始选择一次:

SELECT SYS.TABLES.NAME AS t
FROM SYS.TABLES INNER JOIN SYS.COLUMNS
ON SYS.TABLES.OBJECT_ID = SYS.COLUMS.OBJECT_ID 
WHERE SYS.COLUMNS.NAME = 'ID' AND EXISTS (SELECT * FROM t WHERE t.ID LIKE 'a%');

符号“%”表示字母“a”

后面可以出现任何字符组合

答案 2 :(得分:0)

我仍然不知道我的问题是否正确 - 但是试试吧!

使用以下查询获取包含列ID

的所有表
SELECT SYS.TABLES.NAME , SYS.COLUMNS.NAME
FROM SYS.TABLES INNER JOIN SYS.COLUMNS
ON SYS.TABLES.OBJECT_ID = SYS.COLUMNS.OBJECT_ID 
WHERE SYS.COLUMNS.NAME = 'ID';

您必须遍历表格名称(想想cursorwhile等)。

在循环中,尝试类似这样的东西

declare @resultcount int;
declare @QueryMain as nvarchar(4000)
set @QueryMain = N'SELECT * FROM <TABLE_NAME> WHERE ID LIKE ''a%'''
exec sp_executesql @QueryMain
set @resultcount = @@rowcount;

检查@resultcount的值以查看当前表名是否合格并使用类似临时表的内容来收集它。

您可以使用sp_executesql中的其他选项来调整此查询