列名无效虽然它在那里!

时间:2010-09-22 07:03:53

标签: c# sql

我正在尝试打印出来自DB的表,其中EntityId列等于DataclassId列,这里是代码

    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”中的所有列时,它们就在那里......

谁能告诉我为什么会出现这样的错误?

修改

我真正想要的是查询db TacOps_4_0_0_4_test而不是系统。我刚刚意识到这一点

编辑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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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个结果集。

或者,您可以为UNION创建一个视图,然后查询该视图(每次添加新表时都需要更新视图)。

或者,您可以根据上面的内容进行一些动态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,然后从中创建一个视图。然后,您可以从该视图中选择。

当然,您可以在尝试时逐个循环每个表格。

答案 2 :(得分: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')

答案 3 :(得分:0)

好吧,如果你在SQL Management Studio中执行sp_help 'sys.Tables',你会发现这些列确实不是sys.Tables的一部分......