Trước hết, bạn đang cố gắng nối hai chuỗi với +
, nhưng toán tử SQL để nối là ||
, với thông tin đó, bạn có thể nghĩ rằng kết quả mong đợi sẽ là ( sẽ không hoạt động ):
\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);
Nhưng mà! COPY
lệnh mong đợi một chuỗi ký tự cho đường dẫn, không phải một biểu thức, vì vậy bạn thực sự nên cung cấp đường dẫn. Lưu ý rằng nó sẽ hoạt động đối với các lệnh như SELECT
, INSERT
, UPDATE
, v.v.
Với thông tin đó, bạn chỉ có thể sử dụng psql
các biến, như Pavel đã trỏ và nối các chuỗi thành một psql
của biến. Một giải pháp tốt là sử dụng psql
's :'var'
cú pháp chèn biến dưới dạng một chuỗi vào biểu thức 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);
Cái nào sẽ tạo (sẽ gửi đến máy chủ của 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'
này cú pháp sẽ không hoạt động trên tất cả psql
phiên bản (tôi không nhớ cái này đã được giới thiệu bây giờ), nhưng đối với các phiên bản cũ, bạn có thể dễ dàng sử dụng tính năng trích dẫn đô la:
\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);
Hoặc thoát vào dấu ngoặc đơn:
\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);
Đó là nó.