PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

como usar variáveis ​​em um script psql


Em primeiro lugar, você está tentando concatenar duas strings com + operador, mas o operador SQL para concatenação é || , com essas informações, você poderia pensar que o resultado esperado seria (não funcionará ):
\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);

Mas! O COPY O comando espera uma string literal para o caminho, não uma expressão, então você realmente deve fornecer o caminho. Observe que funcionaria para comandos como SELECT , INSERT , UPDATE , etc

Com essas informações, você só pode usar psql variáveis, como Pavel apontou, e concatenar as strings em um psql variável de. Uma boa solução é usar o psql 's :'var' sintaxe, que insere a variável como uma string na expressão 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);

Que vai gerar (vai enviar para o servidor do 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);

Este :'var' sintaxe não funcionará em todos os psql versões (não me lembro agora qual foi introduzida), mas para versões antigas você pode facilmente usar cotações de dólares:
\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 escape entre aspas 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);

É isso.