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.