2010-09-22 58 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

相關問題