2017-04-06 94 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