加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 具有动态文件名的COPY

发布时间:2021-02-24 19:05:44 所属栏目:MsSql教程 来源:网络整理
导读:我正在尝试编写一个函数来将csv数据加载到表中.我希望输入参数是文件的路径. CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar) RETURNS void AS$BODY$BEGINCOPY climatedata( climatestationid,date,prcp,prcpqflag,prcpmflag,prcpsflag,tm

我正在尝试编写一个函数来将csv数据加载到表中.我希望输入参数是文件的路径.

CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
  RETURNS void AS
$BODY$
BEGIN
COPY climatedata(
    climatestationid,date,prcp,prcpqflag,prcpmflag,prcpsflag,tmax,tmaxqflag,tmaxmflag,tmaxsflag,tmin,tminqflag,tminmflag,tminsflag)
  FROM $1
  WITH csv header;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.filltmaxa(character varying)
  OWNER TO postgres;

当我尝试创建此功能时,我得到了

syntax error at $1

它出什么问题了?

解决方法

首先,您的函数名称不匹配:
CREATE OR REPLACE FUNCTION public.loaddata(filepathname varchar)
...
ALTER FUNCTION public.filltmaxa(character varying)

但这是一个额外的问题.

回答

你需要动态SQL:

CREATE OR REPLACE FUNCTION loaddata(filepathname text)
  RETURNS void AS
$func$
BEGIN

EXECUTE format ('
COPY climatedata(
      climatestationid,tminsflag)
FROM %L
(FORMAT CSV,HEADER)',$1);  -- current syntax
--- WITH CSV HEADER',$1);   -- tolerated legacy syntax

END
$func$LANGUAGE plpgsql;

format()需要PostgreSQL 9.1.
这样,我们可以提供文件名而无需额外的一组(转义)单引号.呼叫:

SELECT loaddata('/absolute/path/to/my/file.csv')

这非常容易受到SQL注入的影响.为了防止它,我使用%L的format()来清理文件名.这也包括必要的封闭单引号.

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读