sql >> Database >  >> RDS >> PostgreSQL

variabelen gebruiken in een psql-script

Allereerst probeer je twee strings samen te voegen met + operator, maar de SQL-operator voor aaneenschakeling is || , met die informatie zou je kunnen denken dat het verwachte resultaat zou zijn (werkt niet .) ):

\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);

Maar! De COPY commando verwacht een letterlijke tekenreeks voor het pad, geen uitdrukking, dus je zou echt het pad moeten geven. Merk op dat het zou werken voor commando's zoals SELECT , INSERT , UPDATE , enz.

Met die informatie kun je alleen psql . gebruiken variabelen, zoals Pavel aangaf, en voeg de strings samen tot een psql 's variabele. Een goede oplossing is om de psql . te gebruiken 's :'var' syntaxis, die de variabele als een tekenreeks invoegt in de SQL-expressie:

\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);

Die zal genereren (verzenden naar de server van 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);

Deze :'var' syntaxis werkt niet op alle psql versies (ik weet nu niet meer welke dit werd geïntroduceerd), maar voor oude versies kun je gemakkelijk dollarcitaten gebruiken:

\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);

Of escape in enkele aanhalingstekens:

\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);

Dat is het.



  1. Mysqli bind_param gebruiken met datum- en tijdkolommen?

  2. InnoDB-tabellen samenvoegen met MyISAM-tabellen

  3. PostgreSQL - Wachtwoordverificatie mislukt na het toevoegen van groepsrollen

  4. Wat is het equivalent van 'tabel beschrijven' in SQL Server?