Allereerst probeer je twee strings samen te voegen met +
operator, maar de SQL-operator voor aaneenschakeling is ||
, met die informatie zou je kunnen denken dat het verwachte resultaat zou zijn (werkt niet .) ):
\set path '''c:\\server\\data\\'''
COPY paymentMethods (name,regexString) FROM :path || 'paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :path || 'priceLevels.csv' WITH (FORMAT csv, HEADER false);
Maar! De COPY
commando verwacht een letterlijke tekenreeks voor het pad, geen uitdrukking, dus je zou echt het pad moeten geven. Merk op dat het zou werken voor commando's zoals SELECT
, INSERT
, UPDATE
, enz.
Met die informatie kun je alleen psql
. gebruiken variabelen, zoals Pavel aangaf, en voeg de strings samen tot een psql
's variabele. Een goede oplossing is om de psql
. te gebruiken 's :'var'
syntaxis, die de variabele als een tekenreeks invoegt in de SQL-expressie:
\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM :'paymentMethodsPath' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :'priceLevels' WITH (FORMAT csv, HEADER false);
Die zal genereren (verzenden naar de server van PostgreSQL):
COPY paymentMethods (name,regexString) FROM E'c:\\server\\data\\paymentMethods.csv' WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM E'c:\\server\\data\\priceLevels.csv' WITH (FORMAT csv, HEADER false);
Deze :'var'
syntaxis werkt niet op alle psql
versies (ik weet nu niet meer welke dit werd geïntroduceerd), maar voor oude versies kun je gemakkelijk dollarcitaten gebruiken:
\set path 'c:\\server\\data\\'
\set paymentMethodsPath :path 'paymentMethods.csv'
\set priceLevelsPath :path 'priceLevels.csv'
COPY paymentMethods (name,regexString) FROM $$:paymentMethodsPath$$ WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM $$:priceLevels$$ WITH (FORMAT csv, HEADER false);
Of escape in enkele aanhalingstekens:
\set path 'c:\\server\\data\\'
\set paymentMethodsPath 'E''':path'paymentMethods.csv'''
\set priceLevelsPath 'E''':path'priceLevels.csv'''
COPY paymentMethods (name,regexString) FROM :paymentMethodsPath WITH (FORMAT csv, HEADER true);
COPY priceLevels (name) FROM :priceLevels WITH (FORMAT csv, HEADER false);
Dat is het.