Zunächst versuchen Sie, zwei Strings mit +
zu verketten Operator, aber der SQL-Operator für die Verkettung ist ||
, mit diesen Informationen könnte man annehmen, dass das erwartete Ergebnis (funktioniert nicht ):
\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);
Aber! Die COPY
Befehl erwartet eine wörtliche Zeichenfolge für den Pfad, keinen Ausdruck, also sollten Sie den Pfad wirklich angeben. Beachten Sie, dass es für Befehle wie SELECT
funktionieren würde , INSERT
, UPDATE
usw.
Mit diesen Informationen können Sie nur psql
verwenden Variablen, wie Pavel gezeigt hat, und verketten die Zeichenfolgen zu einem psql
's Variable. Eine gute Lösung ist die Verwendung von psql
's :'var'
Syntax, die die Variable als String in den SQL-Ausdruck einfügt:
\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);
Was generiert (wird an den PostgreSQL-Server gesendet):
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);
Dieses :'var'
Syntax funktioniert nicht auf allen psql
Versionen (ich weiß jetzt nicht mehr, welche das eingeführt wurde), aber für alte Versionen können Sie einfach Dollar-Quotes verwenden:
\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);
Oder in einfache Anführungszeichen umwandeln:
\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);
Das ist es.