2014-01-15 3 views
1

.csv 파일에 SQL Server 쿼리의 결과를 저장하는 작업이 있습니다. 일부 인터넷 검색 후에 PowerShell을 사용하기로 결정했습니다. 스크립트를 발견하고 조금 수정했는데 작동하고 거의 모든 것이 정상입니다.SQL 쿼리를 CSV로 내보낼 때 출력 형식을 지정하는 방법

$server = "server" 
$database = "database" 
$query = "SELECT * from et_thanks" 

$tod = Get-Date; 
$file = "{0:yyyyMMdd}_go.csv" -f $tod; 
$extractFile = @" 
\\info\export_files\$file 
"@ 

$connectionTemplate = "Data Source={0};Integrated Security=SSPI;Initial Catalog={1};" 
$connectionString = [string]::Format($connectionTemplate, $server, $database) 
$connection = New-Object System.Data.SqlClient.SqlConnection 
$connection.ConnectionString = $connectionString 

$command = New-Object System.Data.SqlClient.SqlCommand 
$command.CommandText = $query 
$command.Connection = $connection 

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $command 
$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($DataSet) 
$connection.Close() 

$DataSet.Tables[0] | Export-Csv -Force -Delimiter ";" $extractFile 

하지만 내가 해결할 수없는이 문제가 :

  1. 을 내가 첫 번째 줄에 .csv 내가 열 헤더를 참조 파일 및 주석 문자열 열 때 :

    #TYPE System.Data.DataRow 
    "ob_no","c_name","c_visible","c_fp","e_from","e_to" 
    "436439","09.09.2013 11:29:08","0","","10937","260153" 
    

    을 어떻게 제거 할 수 있습니까?

  2. 모든 값은 따옴표로 묶습니다. 내보낼 때 스크립트를 사용하지 않도록 스크립트를 수정할 수 있습니까? Autoreplace는 좋은 생각이 아닙니다. 왜냐하면 인용 부호가 SQL 데이터에서 발견 될 가능성이 있기 때문입니다.

문서 (http://ss64.com/ps/export-csv.html)에서 답변을 찾으려고 시도했지만 성공하지 못했습니다.

답변

3

따옴표를 제거하는 데 문제가있을 수 있지만 실제로 원하는 경우 다음과 같이하면됩니다.

-NoTypeInformation은보고있는 추가 유형 정보를 삭제합니다. 이것은 아무것도 최종 문자열이 Out-File으로 파이프됩니다와 "의 모든 인스턴스를 대체하여 다음에 CSV의 문자열 표현으로 변환하는 convertto-csv를 사용

($DataSet.Tables[0] | ConvertTo-Csv -Delimiter ";" -NoTypeInformation) -replace "`"", "" | ` 
Out-File -Force $extractFile 

.

+0

감사합니다. 따옴표와 열 이름을 읽는 것은 불가능한 것처럼 보입니다. 수출은 csv-standarts를 통해 이루어집니다. Export-Csv cmdlet은 내 작업에 대한 최선의 아이디어가 아닙니다. – Cove

0

는 수출 CSV 최고의 아니다 합의 .. 작업을위한 도구 내가 sqlcmd.exe를 사용하거나 도구가 설치되어 제공되는 SQL 서버의 명령 줄을있는 Bcp.exe 것 또한 데이터 테이블에서 CSV를 제작하는 간단한 루틴을 만들 수 :

$result = new-Object text.stringbuilder 
$dt = $DataSet.Tables[0] 

foreach ($dr in $dt.Rows) { 
      for ($i = 0; $i -lt $dt.Columns.Count; $i++) { 

       $null = $result.Append($($dr[$i]).ToString()) 
       $null = $result.Append($(if ($i -eq $dt.Columns.Count - 1) {"`n" } else { ","})) 
      } 
} 

$result.ToString() 
+0

당신의 충고에 감사드립니다. – Cove

1

을 ... 헤더를 없애기 위해 데이터를 csv (Convert-Csv)로 먼저 변환 한 다음 해당 결과를 Select로 파이프하여 첫 번째 레코드를 건너 뜁니다.

관련 문제