누군가 이 명령을 작성하는 올바른 방법을 말해 줄 수 있습니까?
참고 - 이것은 탈출 문제로 귀결되는 것 같습니다. 닫힌 기사가 몇 개 있지만 명령으로 실행될 솔루션을 찾지 못했습니다(예)
이 명령은 데이터베이스를 쿼리하여 결과를 기반으로 파일을 생성합니다.
bcp \
"SELECT * FROM [database].[dbo].[table] CAST(timestamp as DATE) = '2015-11-01'" \
queryout /tmp/2015-11-01.txt \
-S server \
-U user \
-P pwd \
-c
나는 매달 매일 이 스크립트를 쓰고 싶습니다.
for i in 01 02 03
do
bcp \
"\"SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '2015-11-${i}';"\"
queryout /tmp/2015-11-${i}.txt \
-S server \
-U user \
-P pwd \
-c
done
bash의 출력은 수정/이스케이프되고 있음을 보여줍니다.
bash -x ./command.sh
bcp '"SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '\''2015-11-01'\'';"' ....
수정된 SQL은 여전히 SQL Server로 전달되지만 의미가 없으며 행을 가져오지 않습니다. bcp는 다음과 같이 큰따옴표로 묶인 문자열(큰따옴표와 작은따옴표 모두)만 허용합니다.
"SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '2015-11-01';"
이것이 가능합니까?
모든 도움에 감사드립니다. TD
답변1
당신은 이 문제를 지나치게 생각하고 있습니다. bcp
테이블이나 select...
문을 설명하는 첫 번째 인수로 문자열이 필요합니다. 평소와 같이 쉘은 가장 바깥쪽 따옴표를 제거하고 큰따옴표이므로 "..."
찾은 쉘 변수의 값을 삽입합니다.
for i in 01 02 03
do
bcp "SELECT * FROM [database].[dbo].[table] where CAST(timestamp_field as DATE) = '2015-11-${i}'" \
queryout /tmp/2015-11-${i}.txt \
-S server -U user -P pwd -c
done
그리고 마찬가지로
test -z "$odbc_dsn" && read -p 'ODBC DSN: ' odbc_dsn
test -z "$username" && read -p 'Username: ' username
test -z "$password" && read -sp 'Password: ' password
for tb in databases all_columns all_views
do
bcp "master.sys.$tb" out "$tb.txt" -c -D -S "$odbc_dsn" -U "$username" -P "$password"
echo "Table $tb"
sed 's/^/| /' "$tb.txt"
echo
done