2017-07-06 51 views
0

我想要选择所有具有相同列的表,并且该列中有一个实例与我指定的字符串格式匹配。当该列包含特定值时,如何从具有特定命名列的表中进行选择?

例如,

表1:

名字,姓氏,ID

表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' 

但当时我不知道如何继续。任何帮助表示赞赏:)

+0

你可能想看看这个SO后 - [?如何设置动态SQL查询的表名(https://stackoverflow.com/questions/20678725/how-to-set-table -name-in-dynamic-sql-query) –

+0

这可能是你正在寻找的第二个难题[查询结果中的T-SQL循环](https://stackoverflow.com/questions/11852782/t-sql-循环查询结果)以防万一您不熟悉它。我想你可以把它放在一起。 –

+0

为什么在您的示例中包含Table3,它缺少您定位的列(ID)? –

回答

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 
+0

开始的记录!谢谢你斯坦! – swordgit

+0

@swordgit没问题 - 它承担了我几次尝试,但我们到了那里! –

+0

@swordgit另外,您不必为我做这件事,但在将来,您应该提出任何有助于您的问题,以便将来遇到类似问题的用户可以快速找到最佳答案。 –

0

您可以使用“喜欢”,选择一次以“”开头的:

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%'); 

符号“%”表示任意字符的组合可以是字母“之后存在一个“

+1

SYS.COLUMNS.NAME只引用列的名称,但不包含列所包含的值,所以它不起作用,我正在查找包含从字母a开始的值的列 – swordgit

+1

恐怕这是不是OP要求的。如果我理解正确,他希望列ID为记录的所有表格以'a'开头。某种类似DB的广告。 –

+0

对不起,我误解了你的问题@swordgit,你可以发布类似于你的名字的代码吗?这会帮助我更好地理解 –

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值,看看是否CURREN t表名称有资格并使用类似临时表的东西来收集它。

你可能会使用其他选项sp_executesql调整这个查询

相关问题