我正在尝试打印出来自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
答案 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的一部分......