2017-04-06 22 views
2

我在sql server中有一列需要選擇,我不能選擇,但似乎存在。它是隻讀列還是其他問題?希望我在這裏添加了足夠的信息,並將我的列和表的名稱更改爲通用名稱。如何選擇一個不可選的列

SELECT t.name as TName, c.name AS ColName 
FROM sys.columns c 
JOIN sys.tables t ON c.object_id = t.object_id 
WHERE upper(c.name) like '%MY_COLUMN_NAME%' 

TName  ColName  
------  ----------- 
My_Table My_Column 

但是當我嘗試選擇它時,它說它不存在。有沒有解決方法?

select My_Column from My_Table 

Msg 207, Level 16, State 1, Line 9 
Invalid column name 'My_Column'. 

當我嘗試了所有的信息,我得到這個:

SELECT t.name as TName, c.name AS ColName, t.*, c.* 
FROM sys.columns c 
JOIN sys.tables t ON c.object_id = t.object_id 
WHERE upper(c.name) like '%My_Column%' 

TName                               ColName                               name                                object_id principal_id schema_id parent_object_id type type_desc             create_date    modify_date    is_ms_shipped is_published is_schema_published lob_data_space_id filestream_data_space_id max_column_id_used lock_on_bulk_load uses_ansi_nulls is_replicated has_replication_filter is_merge_published is_sync_tran_subscribed has_unchecked_assembly_data text_in_row_limit large_value_types_out_of_row is_tracked_by_cdc lock_escalation lock_escalation_desc           is_filetable object_id name                                column_id system_type_id user_type_id max_length precision scale collation_name                             is_nullable is_ansi_padded is_rowguidcol is_identity is_computed is_filestream is_replicated is_non_sql_subscribed is_merge_published is_dts_replicated is_xml_document xml_collection_id default_object_id rule_object_id is_sparse is_column_set 
-------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ----------- ------------ ----------- ---------------- ---- ------------------------------------------------------------ ----------------------- ----------------------- ------------- ------------ ------------------- ----------------- ------------------------ ------------------ ----------------- --------------- ------------- ---------------------- ------------------ ----------------------- --------------------------- ----------------- ---------------------------- ----------------- --------------- ------------------------------------------------------------ ------------ ----------- -------------------------------------------------------------------------------------------------------------------------------- ----------- -------------- ------------ ---------- --------- ----- -------------------------------------------------------------------------------------------------------------------------------- ----------- -------------- ------------- ----------- ----------- ------------- ------------- --------------------- ------------------ ----------------- --------------- ----------------- ----------------- -------------- --------- ------------- 
My_Table                               My_Column                            My_Table                               1223935682 NULL   20   0    U USER_TABLE             2014-02-19 10:35:44.537 2017-02-11 12:48:13.037 0    0   0     1     NULL      39     0     1    0    0      0     0      0       0     0       0     0    TABLE              0   1223935682 My_Column                            7   104   376   1   1   0  NULL                                1   0    0    0   0   0    0    0      0     0     0    0     0     0    0   0 

(影響1行(S))

+0

當你執行「SELECT * FROM表」語句你得到了什麼結果呢?它是否顯示結果中的列? – Shell

+0

這會返回多少行? select * from sys.tables where name ='My_Table' –

+0

這是一個棘手的服務器b/c他們使用服務器對象來連接另一個數據庫,他們沒有將所有模式添加到連接/鏈接的數據庫。所以它只爲dbo模式返回一行。 – RetroCoder

回答

2

你有在具有不同的模式相同名稱的表不同的列?

您的結果看起來像是bit列,而schema_id20,所以我懷疑它是默認架構(dbo)。但我可能會讀錯,因爲值和標題看起來像是失去了對齊。

select 
    TName = quotename(schema_name(t.schema_id))+'.'+quotename(t.name) 
    , ColName = c.name 
from sys.columns c 
    inner join sys.tables t 
    on c.object_id = t.object_id 
where c.name like '%My_Column%' 
+1

哇...是的。它有一個名爲StateOfCalifornia的模式添加了列。其中之一是my_column。 thx – RetroCoder

+1

@RetroCoder樂於幫助! – SqlZim

+0

爲了更好地解釋這個......有兩個表:一個是dbo架構,另一個是StateOfCalifornia架構。 dbo一個在dbo.My_Tables中,不存在My_Column,而StateOfCalifornia模式存在於StateOfCalifornia.My_Tables中。 *表名是相同的,模式是不同的。如果你在加利福尼亞,我想這個想法可能需要額外的專欄,否則你不需要。 – RetroCoder

1

它可能在不同的模式。
嘗試使用以下查詢,因爲這也會爲您提供模式名稱。

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MY_COLUMN';

這個假設是由於做出這樣的事實,在最後一次查詢的schema_id爲0

+2

請勿使用INFORMATION_SCHEMA.COLUMNS視圖來確定架構。它在文檔中說明你不應該使用它。 https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/columns-transact-sql不過,我同意不同的模式可能是問題的原因。 –

+0

我用Column_Name嘗試過它,它有點。我應該仍然能夠以某種方式從該表中選擇該列? – RetroCoder

相關問題