ODBC SQL语法理解:目录查询相关示例及问题咨询
ODBC SQL规范及元数据查询问题解答
核心概念前置说明
ODBC的互操作性实现分为两个平行体系:
- ODBC API目录函数:属于SDK层面的标准接口,驱动内部完成不同数据库的元数据查询逻辑适配,你找到的
SQLTables示例就属于这一体系 - ODBC标准SQL语法:基于SQL-92规范+ODBC专属转义序列实现,可直接作为SQL语句执行,跨数据库兼容
问题1:查询所有表的ODBC SQL示例
符合ODBC规范的SQL写法如下:
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE';
如果使用ODBC API目录函数实现,直接调用SQLTables接口即可,无需自行编写SQL语句。
问题2:查询指定表列信息、主键的ODBC SQL示例
查询指定表所有列
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = '你的库名' AND TABLE_SCHEMA = '你的schema名' AND TABLE_NAME = '你的表名';
查询指定表主键列
SELECT kcu.COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND kcu.TABLE_CATALOG = tc.TABLE_CATALOG AND kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY' AND kcu.TABLE_CATALOG = '你的库名' AND kcu.TABLE_SCHEMA = '你的schema名' AND kcu.TABLE_NAME = '你的表名';
对应API目录函数为SQLColumns、SQLPrimaryKeys,调用后直接返回结果集,无需编写SQL。
问题3:原生T-SQL与ODBC SQL写法对比
查询所有表
- T-SQL原生写法(仅SQL Server可用):
SELECT name AS TABLE_NAME FROM sys.tables WHERE type = 'U';
- ODBC SQL写法(所有兼容ODBC驱动的数据库可用):
就是问题1里的INFORMATION_SCHEMA查询语句。
查询指定表所有列
- T-SQL原生写法:
SELECT name AS COLUMN_NAME FROM sys.columns WHERE object_id = OBJECT_ID('dbo.你的表名');
- ODBC SQL写法:
就是问题2里的列查询语句。
问题4:SSMS中判断SQL是否符合ODBC规范的方法
- 语法校验规则:
- 禁止使用SQL Server专属语法、函数,比如
TOP、GETDATE()、ISNULL()、sys系统表查询等 - 所有非SQL-92标准的逻辑使用ODBC转义序列包裹,比如日期常量写
{d '2024-01-01'},函数调用写{fn CURDATE()}替代GETDATE() - 元数据查询统一使用
INFORMATION_SCHEMA系统视图,不使用各数据库专属系统表
- 禁止使用SQL Server专属语法、函数,比如
- 功能校验:
调用ODBC API的SQLNativeSql函数,输入你编写的SQL语句,如果驱动可正常将其转换为对应数据库的原生SQL,说明符合ODBC规范。也可以使用ODBC Test工具直接执行语句验证跨库兼容性。
补充说明
你找到的SQLTables代码示例是ODBC规范的标准组成部分,和ODBC标准SQL语法是两种并行的互操作实现方案:API目录函数的兼容性更好,驱动已经完成了所有底层适配;标准SQL写法的灵活性更高,无需依赖SDK接口调用,可直接执行。两种方案都可以实现跨数据库的统一访问需求。
内容的提问来源于stack exchange,提问作者Brent Arias
相关产品推荐
相关产品推荐

