2

Я искал ответы на эту тему, и я опубликовал их на другом форуме, но это, кажется, шрифт всех знаний. Я пытаюсь извлечь данные из базы данных SQL Server 2000 с помощью PowerShell. Сценарий Powershell вызывает хранимую процедуру, затем извлекает данные и экспортирует-csv, а CSV. Проблема в том, что поля datetime в выводимых данных потеряли миллисекунды. Это происходит, когда PowerShell извлекает данные из базы данных во временную таблицу. Вот два бита кода.Извлечение данных в миллисекундах из хранимой процедуры 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 

Поскольку другая хранимая процедура SP_agent создается с помощью программного обеспечения, я не могу изменить его. Кроме того, я не хочу реплицировать программную определенную хранимую процедуру (с помощью SELECT convert в varchar для datetime) в моей текстовой строке команды, так как это хранимая процедура бегемот.

Любая помощь будет полезна.

+0

Нет, к сожалению, нет. Когда я запускаю хранимую процедуру SAP_proc (которую я создал для использования dateadd и current_timestamp), она возвращает DateTime с миллисекундами, проблема возникает при извлечении в DataSet в PowerShell, когда я просматриваю скрипт, и я просто показываю DataTable как против, чтобы экспортировать его в CSV, нет миллисекундных данных. Если я запустил SP через диспетчер SQL и экспортировал сетку результатов в CSV, у меня есть миллисекундные данные. Да, я знаю, что SP_agent плохо назван. Я не создал это программное обеспечение на сервере. – wbbigdave

ответ

0

Это не проблема с Powershell или проблема с temp. Это связано с тем, что столбец datetime преобразуется в строку при вызове export-csv с использованием метода tostring по умолчанию, который не включает миллисекунды. Если вы хотите миллисекунды затем указать его в вызове метода 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> 

Отредактировано 10/17/2012 Похоже, у вас возникли проблемы с этим до сих пор. Итак, вот полный скрипт, который я тестировал, выводит миллисекунды. Вам нужно будет изменить раздел переменной в вашу среду. Я надеюсь, что это помогает:

#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.10.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; раздел, что такое дата. Я все время получаю ошибки. – wbbigdave

+0

Хорошо, быстро обновляется, это не когда я экспортирую в CSV, что эта проблема возникает. Это после того, как я заполнил $ DataTable командой $ DataSet.Table [0]. Если после этого я вызову $ DataTable, я потеряю миллисекунды данных. – wbbigdave

+0

Проблема у меня есть, я не могу использовать запрос выбора, поскольку все это основано на вызове хранимой процедуры. Я не могу использовать хранимую процедуру, которую я вызываю в своей маленькой хранимой процедуре, поскольку она слишком длинная (около трех страниц). Не уверен, что делать сейчас. Кажется, что миллисекундные данные отбрасываются, когда я заполняю DataSet, поскольку я отобразил набор данных после его заполнения. – wbbigdave

Смежные вопросы