2

이 주제에 대한 응답을 찾고 다른 포럼에 게시했지만 이것은 모든 지식의 글꼴 인 것 같습니다. PowerShell을 사용하여 SQL Server 2000 데이터베이스에서 데이터를 가져 오려고합니다. Powershell 스크립트는 저장 프로 시저를 호출 한 다음 데이터를 추출하고 export-csv를 CSV로 출력합니다. 문제는 출력 된 데이터의 날짜/시간 필드가 밀리 초 손실되었음을 나타냅니다. 이 문제는 PowerShell이 ​​데이터베이스의 데이터를 임시 테이블로 추출 할 때 발생합니다. 다음은 두 가지 코드입니다. 다른 저장 프로 시저 SP_agent이 소프트웨어에 의해 생성되기 때문에SQL 저장 프로 시저에서 밀리 초 데이터를 추출하십시오.

PowerShell 스크립트

#VARIABLES 
$SqlQuery = "SAP_proc" 
#Connection Strings 
$Server = "server" 
$Database = "db_dab" 
#Output Files 
$OutputPath = "c:\Sapout.csv" 
#END OF VARIABLES 

#SQL Connection 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Database=$Database;Integrated Security=True" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = "SAP_proc" 
$SqlCmd.Connection = $SqlConnection 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$DataOut = $SqlAdapter.Fill($DataSet) 
#$DataOut = $SqlAdapter.FillSchema($DataSet,[System.Data.SchemaType]::Source) 
#Data Manipulation 
$DataOut | Out-Null 
#Export Data to Hash Table 
$DataTable = $DataSet.Tables[0] 
#Export Has table to CSV 
$DataTable | Export-CSV -Delimiter "," -Encoding Unicode -Path $OutputPath -NoTypeInformation 
$SqlConnection.Close() 

저장 프로 시저

ALTER proc [dbo].[SAP_proc] 
as 
DECLARE @return_value int 
DECLARE @starttime datetime 
DECLARE @endtime datetime 

SET @starttime = DATEADD (dd, -30, CURRENT_TIMESTAMP) 
SET @endtime = CURRENT_TIMESTAMP 

EXEC @return_value = [dbo].[sp_agent] 
     @starttime 
     ,@endtime 

SELECT 'Return Value' = @return_value 

나는 그것을 편집 할 수 없습니다. 또한 나는 비주얼 저장 프로 시저이므로 소프트웨어로 정의 된 저장 프로 시저 (SELECT가 datetime에 대해 varchar로 변환 됨)를 내 명령 텍스트 문자열에 복제하고 싶지 않습니다.

도움이 될 것입니다.

+0

아니요. 불행히도 없습니다. 내가 저장 프로 시저 SAP_proc (dateadd 및 current_timestamp를 사용할 수 있도록 만든)를 실행하면 밀리 초 단위의 DateTime이 반환되고, 스크립트를 단계별로 실행할 때 PowerShell의 DataSet으로 추출 할 때 문제가 발생하고 DataTable을 다음과 같이 표시합니다. 그것을 CSV로 내보내는 것에 반대하여 밀리 초 데이터가 없습니다. SQL 관리자를 통해 SP를 실행하고 결과 표를 CSV로 내보내는 경우 밀리 초 데이터가 있습니다. 예, SP_agent의 이름이 잘못되었습니다. 나는 서버에서 소프트웨어를 만들지 않았다. – wbbigdave

답변

0

이것은 Powershell 문제 또는 임시 테이블 문제가 아닙니다. 이는 milliseconds를 포함하지 않는 기본 tostring 메서드를 사용하여 export-csv를 호출 할 때 datetime 열이 문자열로 변환되기 때문입니다. 당신이 밀리 초를 원하는 경우 toString 메소드의 호출을 지정

$a = get-date 
$a.ToString("d/M/yyyy hh:mm:ss.fff tt") 

#To to something similar with your export-csv of a datatable you can create an expression: 

$DataTable | select column1, column2, @{n=datecolumn;e={$_.datecolumn.ToString("d/M/yyyy hh:mm:ss.fff tt")}} | export-csv <rest of code> 

편집 2012년 10월 17일 을 여전히이 문제가있는 것 같다. 그래서 여기에 테스트 된 전체 스크립트가 밀리 초 단위로 출력됩니다. 변수 섹션을 환경으로 변경해야합니다. 난이 도움이 되었으면 좋겠 :

#VARIABLES 
$SqlQuery = "select 'test' as column1, 'milliseconds' as column2, getdate() as datecolumn" 
#Connection Strings 
$Server = "$env:computername\sql1" 
$Database = "tempdb" 
#Output Files 
$OutputPath = "./millisec.csv" 
#END OF VARIABLES 

#SQL Connection 
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Database=$Database;Integrated Security=True" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.CommandText = $SqlQuery 
$SqlCmd.Connection = $SqlConnection 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$DataOut = $SqlAdapter.Fill($DataSet) 
#$DataOut = $SqlAdapter.FillSchema($DataSet,[System.Data.SchemaType]::Source) 
#Data Manipulation 
$DataOut | Out-Null 
#Export Data to Hash Table 
$DataTable = $DataSet.Tables[0] 
#Export Has table to CSV 
#$DataTable | Export-CSV -Delimiter "," -Encoding Unicode -Path $OutputPath -NoTypeInformation 
$DataTable | select column1, column2, @{n='datecolumn';e={$_.datecolumn.ToString("M/d/yyyy hh:mm:ss.fff tt")}} | export-csv $OutputPath -NoTypeInformation -force 

$SqlConnection.Close() 

#Another 코드 예제를 설명과 함께. 추가됨 10/23/2012

#VARIABLES 
$SqlQuery = "select getdate() as datecolumn" 
#Connection Strings 
$Server = "$env:computername\sql1" 
$Database = "tempdb" 


$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Database=$Database;Integrated Security=True" 
$SqlConnection.Open() 
$SqlCmd = new-Object System.Data.SqlClient.SqlCommand($SqlQuery, $SqlConnection) 
$data = $SqlCmd.ExecuteScalar() 
$SqlConnection.Close() 

#Notice NO millisecond 
Write-Output $data 

#See $data is an object of type System.DateTime 
$data | gm 

#There's a property called millisecond 
#Millisecond   Property  int Millisecond {get;} 

#Although you don't "see" millisecond's on screen it's still there 
$data.Millisecond 


#Powershell uses a types and format rules to define how data is display on screen. You can see this by looking at 
#C:\Windows\System32\WindowsPowerShell\v1.0\types.ps1xml and searching for "DataTime". This file along with format file define how data is displayed 
#When you display datatime screen it's implicitly calling 
#Searching for datetime in types.ps1xml you'll find this line: 
#"{0} {1}" -f $this.ToLongDateString(), $this.ToLongTimeString() 

#for our example 

"{0} {1}" -f $data.ToLongDateString(), $data.ToLongTimeString() 

#So millisecond is still there, but if you want millisecond in your output to CSV, screen or file you'll need to call a ToString method with a date format. Here's an example: 
$data.ToString("M/d/yyyy hh:mm:ss.fff tt") 
+0

좋아, 지금 이걸 시도하고 있지만 @ {n = datecoumn; 섹션에서 datecolumn이란 무엇입니까? 오류가 계속 발생합니다. – wbbigdave

+0

Ok 빠른 업데이트,이 문제가 발생하는 CSV로 내보낼 때 아닙니다. $ DataSet.Table [0] 명령으로 $ DataTable을 채운 후에입니다. 그 후 $ DataTable을 호출하면 밀리 초 데이터가 손실됩니다. – wbbigdave

+0

내가 가진 문제는 선택 쿼리를 사용할 수 없다는 것인데 스토어드 프로 시저를 호출하는 것에 기반하고 있기 때문이다. 너무 길기 때문에 작은 저장 프로 시저 내에서 호출하는 저장 프로 시저를 사용할 수 없습니다 (약 3 페이지). 지금 무엇을해야할지 모르겠습니다. 채워진 후 데이터 집합을 표시 할 때 데이터 집합을 채울 때 밀리 초 데이터가 삭제 된 것 같습니다. – wbbigdave