2010-09-22 27 views
0

我试图从具有ENTITYID列等于DataclassId列这里的DB打印出表的代码是无效的列名尽管它在那里!

public void getRootTables_checkSP() 
    { 
     string connect = "Data Source= EUADEVS06\\SS2008;Initial Catalog=TacOps_4_0_0_4_test;integrated security=SSPI; persist security info=False;Trusted_Connection=Yes"; 
     SqlDataReader rootTables_List = null; 
     SqlConnection conn = new SqlConnection(connect); 
     conn.Open(); 

     SqlCommand s_cmd = new SqlCommand("SELECT * FROM sys.Tables WHERE EntityId = DataclassId", conn); 
     rootTables_List = s_cmd.ExecuteReader(); 

     while (rootTables_List.Read()) 
     { 
      string test = rootTables_List[0].ToString(); 
      Console.WriteLine("ROOT TABLES ARE {0}", test); 
     } 
     rootTables_List.Close(); 
     conn.Close(); 
    } 

但它口口声声说这些列是无效的,虽然当我打印出来的所有列在数据库“syscolumns”他们在那里...

谁能告诉我为什么我得到这样的错误?

编辑

我真正想要的是查询数据库TacOps_4_0_0_4_test不系统。我刚刚意识到

EDIT 2

这里是我的数据库

Table_1 
ID Sequence Type Heigh Weight EntityId DataclassId 
0 1   s  1.4  2.5  42-2c-Qi 42-2c-Qi 
1 2   s  2.4  2.5  zh-km-xd zh-km-xd 
2 3   s  3.4  2.5  8n-tr-l7 8n-tr-l7 

Table_2 
ID Data Person EntityId DataclassId 
0 1  Dave  58-zj-4o 41-2c-Q7 
1 2  Sara  99-op-t6 oy-7j-mf 
2 3  Silve 75-qy-47 2d-74-ds 

Table_3 
ID Name Genre EntityId DataclassId 
0 LR  Ac  78-jd-o9 78-jd-o9 
1 OI  Dr  4t-jb-qj 4t-jb-qj 
2 DH  Do  7j-3e-ol 7j-3e-ol 

表格的一例的输出应该是

Table_1 
Table_3 
+2

你是什么意思是“这些列”吗?什么*确切*是错误信息? – 2010-09-22 07:07:06

+0

我试过这个查询>>> SELECT * FROM sys.Tables WHERE EntityId = SQL SERVER 2008中的DataclassId它表示无效的列名称。可能在查询中出错。我从来不知道名为“EntityId”的sys.table中的任何列 - dataclassid – Jsinh 2010-09-22 07:13:30

回答

3

认为我可以理解你在做什么现在尝试根据您的意见Frederik的答案

我试过“syscolumns”只是为了确保 列确实存在。但是,当我 做到哪里ENTITYID = DataclassId它说:“无效的列 名

这听起来像ENTITYID和Dataclassid是在一个表(或表),你在你的数据库中有列,你想查询找到那些包含在这两个??

如果是这样的话,你是不正确的查询SYS.TABLES列相同的值表中的行 - 你需要查询的特定表即直接

SELECT * FROM Table1 WHERE EntityId = DataClassId 

你能澄清吗?

编辑: 你可以找到所有包含使用该这两个列的表:

SELECT t.name 
FROM sys.tables t 
WHERE EXISTS(SELECT * FROM sys.columns c WHERE c.object_id = t.object_id AND c.name='EntityId') 
    AND EXISTS(SELECT * FROM sys.columns c WHERE c.object_id = t.object_id AND c.name='DataClassId') 

这个,你既可以遍历一轮每个表和运行查询,找到匹配的行EntityId/DataClassId值 - 可以插入临时表并返回1结果集。或者,您可以创建一个视图,将所有表联合起来,然后查询该视图(每次添加新表时都需要更新视图)。或者,您可以根据上述内容做一些动态SQL生成,以便动态生成SELECT语句,将所有表一起UNION。

更新: 这里有一个通用的方法来做到这一点纯TSQL - 这样意味着,如果添加了新的表会自动它们包括:

DECLARE @SQL VARCHAR(MAX) 

SELECT @SQL = COALESCE(@SQL + CHAR(10) + 'UNION ALL' + CHAR(10), '') 
    + 'SELECT ''' + REPLACE(QUOTENAME(t.Name), '''', '''''') + ''' AS TableName, COUNT(*) AS RowsMatched FROM ' + QUOTENAME(t.name) 
    + ' WHERE EntityId = DataClassId' 
FROM sys.tables t 
WHERE EXISTS(SELECT * FROM sys.columns c WHERE c.object_id = t.object_id AND c.name='EntityId') 
    AND EXISTS(SELECT * FROM sys.columns c WHERE c.object_id = t.object_id AND c.name='DataClassId') 

SET @SQL = 'SELECT x.TableName, x.RowsMatched FROM (' + @SQL + ') x WHERE x.RowsMatched > 0 ORDER BY x.TableName' 
EXECUTE(@SQL) 

如果你不需要它是动态,将上面的EXECUTE更改为PRINT以查看它生成的SQL,然后从中创建一个视图。然后您可以从该视图中选择。

当然,您可以在您尝试的时候循环遍历每个表格。

+0

这就是我想要的,但我希望这不仅仅是一个 – Reda 2010-09-22 07:18:49

+0

@AdaTheDev :其实我知道所有的表都有EntityId和DataclassId。我不能直接查询他们的等值吗? – Reda 2010-09-22 11:30:09

+0

@Reda - 是的,如果你知道他们都有他们。如果您不想先定义视图,而是想动态查看执行时存在的每个表,则可以取消sys.tables上的WHERE子句以返回所有表 – AdaTheDev 2010-09-22 11:37:24

6

ENTITYID和DataclassId确实没有存在于sys.tables中的列。

你正在从sys.tables中选择数据,在你的查询中没有syscolumns的概念,所以我不知道你为什么在你的解释中提到'syscolumns'?

+1

+1 - sys.tables(或syscolumns/sys.columns)中都不存在这些列 – AdaTheDev 2010-09-22 07:10:12

+0

我试过“syscolumns”只是为了确保列存在。但是,当我做查询EntityId = DataclassId它说“无效的列名称” – Reda 2010-09-22 07:11:01

+0

这是合乎逻辑的...这些列不存在于sys.tables中。 – 2010-09-22 07:11:59

0

好吧,如果你在SQL Management Studio中做sp_help 'sys.Tables'你会发现,确实,那些列不SYS.TABLES的一部分......

1

基于所有的评论,我认为你可能试图找到的是数据库中的所有表都具有EntityID和DataClassID列。

我知道......它有一个漂亮的狂野猜测,但不要怪我尝试! :-)

如果我在相当真棒黑暗是你的问题是正确的投篮,尝试了这一点:

SELECT tabs.name 
FROM sys.tables tabs INNER JOIN sys.columns cols 
ON tabs.object_id = cols.object_id 
AND cols.name IN ('EntityId', 'DataClassId') 
+0

!我想找到只有EntityId列等于DataclassId的表格 – Reda 2010-09-22 07:44:17

+0

@Reda - “列EntityId等于DataclassId”是什么意思?如果列具有相同的数据类型,它们是否相等?列是否相同,如果它们具有相似的数据类型,例如int和smallint类似?什么是等同列的标准? – InSane 2010-09-22 08:12:51

+0

@In Sane:我的意思是它们具有相同的值(即Col_1有3个,Col_2有3个) – Reda 2010-09-22 10:59:41