큰따옴표 작은따옴표 조합 Linux의 BCP

큰따옴표 작은따옴표 조합 Linux의 BCP

누군가 이 명령을 작성하는 올바른 방법을 말해 줄 수 있습니까?

참고 - 이것은 탈출 문제로 귀결되는 것 같습니다. 닫힌 기사가 몇 개 있지만 명령으로 실행될 솔루션을 찾지 못했습니다()

이 명령은 데이터베이스를 쿼리하여 결과를 기반으로 파일을 생성합니다.

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

관련 정보