Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 当列包含特定值时,如何从具有特定命名列的表中进行选择?_Sql_Sql Server - Fatal编程技术网

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

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.

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

比如说,

表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.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也一样,你不必为我这么做,但在将来,你应该对任何有助于你的问题进行投票,以便将来有类似问题的用户能够快速找到最佳答案。