Sql 当列包含特定值时,如何从具有特定命名列的表中进行选择?
我试图选择所有具有相同列的表,并且该列中有一个实例与我指定的字符串格式匹配 比如说, 表1: 名字,姓氏,身份证 表2: ID,值 表3: 名字、价值 我希望结果显示包含ID的表,其中ID以字符“a”开头 到目前为止,我得到的是Sql 当列包含特定值时,如何从具有特定命名列的表中进行选择?,sql,sql-server,Sql,Sql Server,我试图选择所有具有相同列的表,并且该列中有一个实例与我指定的字符串格式匹配 比如说, 表1: 名字,姓氏,身份证 表2: ID,值 表3: 名字、价值 我希望结果显示包含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.
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'
但我不知道如何继续下去。感谢您的帮助:)您可以使用“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”后可以出现任何字符组合。我仍然不知道我是否正确理解了您的问题,但让我们试试 使用以下查询获取所有具有列
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';
您必须遍历表名(考虑游标
,while
等)
在循环中,尝试这样的方法
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;
declare@resultcount int;
声明@QueryMain为nvarchar(4000)
设置@QueryMain=N'SELECT*从ID类似“a%”的位置
exec sp_executesql@QueryMain
set@resultcount=@@rowcount;
检查@resultcount
的值以查看当前表名是否符合条件,并使用类似临时表的内容来收集它
您可以使用中的其他选项来调整此查询此代码经过测试,可以正常工作: 创建一个游标,用于选择column=ID的所有表/列名(我们不需要列变量,因为您只针对“ID”,但我将其包括在内,以防您或其他人需要更多功能) 一旦存储了这些信息,就可以循环遍历游标并执行动态SQL。请注意,这容易受到SQL注入的影响,几乎所有动态SQL都是如此 这种方法将为每个具有列ID的表提供一个单独的datatable,即使没有符合您条件的ID列(您只会得到一个空白datatable) 此外,您还可以根据需要更改变量的大小 请让我知道,如果你需要任何澄清或修改
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
SYS.COLUMNS.NAME仅指列的名称,而不是列包含的值,因此它不起作用,我正在查找包含以字母aI开头的值的列。恐怕这不是OP要求的。若我理解正确,他想要列ID中以“a”开头的记录的所有表的列表。有点像DB宽。很抱歉我误解了你的问题@swordgit,你能用与你名字相似的名字发布代码吗?这会帮助我理解better@gymnif很抱歉,我没有访问构造表的实际代码的权限。Marek是对的,我想列出所有有一列名为ID的表,该表的列至少有一个从字母“a”开始的记录,你可能想看看这篇文章,这可能是你正在寻找的第二个谜题,以防你不熟悉它。我想你可以把它放在一起。为什么要在你的示例中包括表3,因为它缺少你要针对的列(ID)?@swordgit没问题-无可否认,我试了几次,但我们做到了@swordgit也一样,你不必为我这么做,但在将来,你应该对任何有助于你的问题进行投票,以便将来有类似问题的用户能够快速找到最佳答案。