编写返回数值列列表的SQL表值函数时遇报错:Expecting EXTERNAL near 'begin'
问题解决:SQL表值函数
begin处报错Expecting EXTERNAL near 'begin' 错误原因
- 语法格式错误:你混淆了表值函数的两种写法逻辑。内联表值函数不需要
begin/end包裹,直接通过return返回查询结果;如果写多语句表值函数,必须先定义表变量存储结果再返回。 - 参数引用错误:
where TABLE_NAME = table_name里的table_name未引用传入的参数,要写成@table_name才会调用你传入的表名参数。 - 数据类型不匹配:不同数据库的数值类型命名有差异,比如SQL Server没有
NUMBER类型,对应是numeric/decimal;DOUBLE对应float。如果是Snowflake这类数据库,表值函数语法要求更严格,需要用特定格式声明。
修正后的代码(分数据库场景)
场景1:SQL Server(内联表值函数,性能更优)
go create function get_num_col(@table_name varchar(255)) returns table as return ( select column_name from INFORMATION_SCHEMA.columns where TABLE_NAME = @table_name and data_type in ('int', 'numeric', 'decimal', 'float', 'real') )
场景2:SQL Server(多语句表值函数)
go create function get_num_col(@table_name varchar(255)) returns @result table ( column_name varchar(255) ) as begin insert into @result select column_name from INFORMATION_SCHEMA.columns where TABLE_NAME = @table_name and data_type in ('int', 'numeric', 'decimal', 'float', 'real') return end
场景3:Snowflake数据库适配
create or replace function get_num_col(table_name varchar) returns table (column_name varchar) as $$ select column_name from INFORMATION_SCHEMA.columns where TABLE_NAME = table_name and data_type in ('NUMBER', 'FLOAT', 'DOUBLE') $$;
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

