Przede wszystkim próbujesz połączyć dwa ciągi za pomocą +
operator, ale operatorem SQL dla konkatenacji jest ||
, dzięki tym informacjom można by pomyśleć, że oczekiwany wynik będzie (nie zadziała ):
\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);
Ale! COPY
polecenie oczekuje ciągu literału dla ścieżki, a nie wyrażenia, więc naprawdę powinieneś podać ścieżkę. Zauważ, że zadziała dla poleceń takich jak SELECT
, INSERT
, UPDATE
itp.
Mając te informacje, możesz używać tylko psql
zmiennych, jak wskazał Pavel, i połącz ciągi w psql
zmienna. Dobrym rozwiązaniem jest użycie psql
':'var'
składnia, która wstawia zmienną jako ciąg znaków do wyrażenia SQL:
\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);
Który wygeneruje (wyśle do serwera 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);
Ten :'var'
składnia nie będzie działać na wszystkich psql
wersje (nie pamiętam teraz, która to została wprowadzona), ale dla starych wersji można łatwo użyć cudzysłowu w dolarach:
\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);
Lub uciekaj w pojedyncze cudzysłowy:
\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);
To wszystko.