Pertama-tama, Anda mencoba menggabungkan dua string dengan +
operator, tetapi operator SQL untuk penggabungan adalah ||
, dengan informasi itu, Anda dapat berpikir bahwa hasil yang diharapkan adalah (tidak akan berfungsi ):
\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);
Tetapi! COPY
perintah mengharapkan string literal untuk jalur, bukan ekspresi, jadi Anda benar-benar harus memberikan jalur. Perhatikan itu akan berfungsi untuk perintah seperti SELECT
, INSERT
, UPDATE
, dll.
Dengan informasi tersebut, Anda hanya dapat menggunakan psql
variabel, seperti yang ditunjukkan Pavel, dan menggabungkan string menjadi psql
variabel. Solusi yang baik adalah dengan menggunakan psql
's :'var'
sintaks, yang menyisipkan variabel sebagai string ke dalam ekspresi 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);
Yang akan menghasilkan (akan dikirim ke server 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);
:'var'
. ini sintaks tidak akan bekerja pada semua psql
versi (saya tidak ingat sekarang yang mana yang diperkenalkan), tetapi untuk versi lama Anda dapat dengan mudah menggunakan kutipan dolar:
\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);
Atau melarikan diri ke dalam tanda kutip tunggal:
\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);
Itu dia.