PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

comment utiliser des variables dans un script psql

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.