mgr*_*oat 5 sql ms-access odbc ms-access-2013
我有一个数据库,我试图从Access使用ODBC查询.我需要读取的表有304列,我只能在查询生成器中看到前255个.我在其他地方读过,解决方案是手工编写SQL查询而不是依赖于Builder,所以我尝试了这个查询:
SELECT [Field1], [Field304]
FROM [ODBC;DRIVER=SQL Server;UID=USERNAME;SERVER=ServerAddress].[TabelName];
Run Code Online (Sandbox Code Playgroud)
这个查询就像我期望的那样返回Field1,但仍然不会得到Field304.我究竟做错了什么?
您在Access中遇到了ODBC链接表的限制,以及类似的查询
SELECT ... FROM [ODBC;...].[tableName];
Run Code Online (Sandbox Code Playgroud)
实际上只是一种"动态"创建临时ODBC链接表的方法.
当Access创建ODBC链接表时,它会查询远程数据库以获取列信息.在Access中保存表信息的结构限制为255列,因此只有远程表的前255列可用.例如,对于SQL Server表
CREATE TABLE manyColumns (
id int identity(1,1) primary key,
intCol002 int,
intCol003 int,
intCol004 int,
...
intCol255 int,
intCol256 int,
intCol257 int)
Run Code Online (Sandbox Code Playgroud)
一个Access查询,如
SELECT [id], [intCol002], [intCol255]
FROM [ODBC;DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=myDb].[manyColumns];
Run Code Online (Sandbox Code Playgroud)
会工作,但这个查询
SELECT [id], [intCol002], [intCol256]
FROM [ODBC;DRIVER={SQL Server};SERVER=.\SQLEXPRESS;DATABASE=myDb].[manyColumns];
Run Code Online (Sandbox Code Playgroud)
将提示输入"参数"[intCol256],因为Access不知道SQL Server表中存在这样的列.
有两种方法可以解决此问题:
(1)如果您只需要读取Access中的信息,则可以创建Access 传递查询
SELECT [id], [intCol002], [intCol256]
FROM [manyColumns];
Run Code Online (Sandbox Code Playgroud)
这将返回所需的列,但是传递查询始终生成不可更新的记录集.
(2)如果需要可更新的记录集,则需要在SQL Server上创建一个View
CREATE VIEW selectedColumns AS
SELECT [id], [intCol002], [intCol256]
FROM [manyColumns];
Run Code Online (Sandbox Code Playgroud)
然后在Access中创建一个指向View的ODBC链接表.在创建ODBC链接表时,请记住告诉Access主键列是什么,否则链接表将不可更新.