sql >> Base de Datos >  >> RDS >> PostgreSQL

cómo usar variables en un script psql

En primer lugar, está intentando concatenar dos cadenas con + operador, pero el operador SQL para la concatenación es || , con esa información, podría pensar que el resultado esperado sería (no 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);

¡Pero! El COPY el comando espera una cadena literal para la ruta, no una expresión, por lo que realmente debe proporcionar la ruta. Tenga en cuenta que funcionaría para comandos como SELECT , INSERT , UPDATE , etc.

Con esa información, solo puede usar psql variables, como señaló Pavel, y concatenar las cadenas en un psql variable de . Una buena solución es usar el psql 's :'var' sintaxis, que inserta la variable como una cadena en la expresión 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 generará (se enviará al servidor 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);

Este :'var' la sintaxis no funcionará en todos los psql versiones (no recuerdo ahora cuál se introdujo), pero para las versiones antiguas puede usar fácilmente cotizaciones en 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);

O escape entre comillas 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);

Eso es todo.