Tout d'abord, vous essayez de concaténer deux chaînes avec +
, mais l'opérateur SQL pour la concaténation est ||
, avec ces informations, vous pourriez penser que le résultat attendu serait (ne fonctionnera pas ):
\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);
Mais! Le COPY
commande attendez une chaîne littérale pour le chemin, pas une expression, vous devriez donc vraiment donner le chemin. Notez que cela fonctionnerait pour des commandes comme SELECT
, INSERT
, UPDATE
, etc.
Avec ces informations, vous ne pouvez utiliser que psql
variables, comme l'a souligné Pavel, et concaténer les chaînes dans un psql
est variable. Une bonne solution est d'utiliser le psql
's :'var'
syntaxe, qui insère la variable sous forme de chaîne dans l'expression 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);
Qui va générer (enverra au serveur de 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);
Ce :'var'
la syntaxe ne fonctionnera pas sur tous les psql
versions (je ne me souviens plus laquelle a été introduite), mais pour les anciennes versions, vous pouvez facilement utiliser les guillemets en dollars :
\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);
Ou échappez-vous entre guillemets simples :
\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);
C'est tout.