Sql server 无法将数据源中类型字符串的给定值转换为指定目标列的类型uniqueidentifier
我在这里尝试的是,使用PowerShell脚本将数据从.xml文件加载到SQL server数据库 我的剧本是这样的:Sql server 无法将数据源中类型字符串的给定值转换为指定目标列的类型uniqueidentifier,sql-server,string,powershell,datatable,uniqueidentifier,Sql Server,String,Powershell,Datatable,Uniqueidentifier,我在这里尝试的是,使用PowerShell脚本将数据从.xml文件加载到SQL server数据库 我的剧本是这样的: $dataSource = 'dtsrc'; $database = 'tempdb'; #DB $connection = New-Object System.Data.SqlClient.SqlConnection; #setting connection $connection.Conn
$dataSource = 'dtsrc';
$database = 'tempdb'; #DB
$connection = New-Object System.Data.SqlClient.SqlConnection; #setting connection
$connection.ConnectionString = "Server=$dataSource;Database=$database;Integrated Security=True;";
$connection.Open();
$command = New-Object System.Data.SqlClient.SqlCommand;
$command.Connection = $connection;
$as = New-Object System.Data.SqlClient.SqlDataAdapter;
$as.SelectCommand = $command;
$filename = 'C:\DCT\XML\apc.xml'; #file to be loaded into sql server database table
$ds = New-Object System.Data.DataSet;
$ds.ReadXml($filename); #reading from the file -- line gives output InferSchema
$dt = New-Object System.Data.DataTable;
$dt.Columns.Add("StartTime",[datetime]);
$dt.Columns.Add("EndTime",[datetime]);
$dt.Columns.Add("Status",[int]);
$dt.Columns.Add("ProcessedTime",[datetime]);
$dt.Columns.Add("ScheduleId",[guid]);
$dt.Columns.Add("Model",[string]);
$dt.Columns.Add("ModelVersion",[string]);
$dt.Columns.Add("ModelVersionState",[string]);
$dt.Columns.Add("ModifiedTime",[datetime]);
$dt.Columns.Add("WriteBackLastRunTime",[datetime]);
$dt.Columns.Add("ModifiedBy",[string]);
$dt.Columns.Add("ModelType",[int]);
$dt.Columns.Add("IsTimeRange",[int]);#b
$dt.Columns.Add("WriteBackStatus",[int]);
$dt.Columns.Add("RetryWriteBack",[int]);#b
$dt.Columns.Add("NumOfRetry",[int]);
$dt.Columns.Add("FrequencyUnits",[int]);
$dt.Columns.Add("ScheduleType",[int]);
$dt.Columns.Add("CustomType",[int]);
$dt.Columns.Add("ShiftStartTime",[datetime]);
$dt.Columns.Add("StartWeekDay",[int]);
$dt.Columns.Add("EndWeekDay",[int]);
$dt.Columns.Add("WritebackProcessedTime",[datetime]);
$dt.Columns.Add("DiagStatus",[int]);
$dt.Columns.Add("AccountingPeriodCase_PK_ID",[guid]);
$dt = $ds.Tables[0];
$bcp = New-Object 'Data.SqlClient.SqlBulkCopy' $connection; #bulkcopy to the destination table.
$bcp.DestinationTableName = 'dbo.tempor';
#$bcp.ColumnMappings.Count;
$bcp.ColumnMappings.Clear();
$bcp.ColumnMappings.Add('StartTime','StartTime');
$bcp.ColumnMappings.Add('EndTime','EndTime');
$bcp.ColumnMappings.Add('Status','Status');
$bcp.ColumnMappings.Add('ProcessedTime','ProcessedTime');
$bcp.ColumnMappings.Add('ScheduleId','ScheduleId');
$bcp.ColumnMappings.Add('Model','Model');
$bcp.ColumnMappings.Add('ModelVersion','ModelVersion');
$bcp.ColumnMappings.Add('ModelVersionState','ModelVersionState');
$bcp.ColumnMappings.Add('ModifiedTime','ModifiedTime');
$bcp.ColumnMappings.Add('WriteBackLastRunTime','WriteBackLastRunTime');
$bcp.ColumnMappings.Add('ModifiedBy','ModifiedBy');
$bcp.ColumnMappings.Add('ModelType','ModelType');
$bcp.ColumnMappings.Add('IsTimeRange','IsTimeRange');
$bcp.ColumnMappings.Add('WriteBackStatus','WriteBackStatus');
$bcp.ColumnMappings.Add('RetryWriteBack','RetryWriteBack');
$bcp.ColumnMappings.Add('NumOfRetry','NumOfRetry');
$bcp.ColumnMappings.Add('FrequencyUnits','FrequencyUnits');
$bcp.ColumnMappings.Add('ScheduleType','ScheduleType');
#$bcp.ColumnMappings.Add('CustomType','CustomType');
#$bcp.ColumnMappings.Add('ShiftStartTime','ShiftStartTime');
#$bcp.ColumnMappings.Add('StartWeekDay','StartWeekDay');
#$bcp.ColumnMappings.Add('EndWeekDay','EndWeekDay');
$bcp.ColumnMappings.Add('WritebackProcessedTime','WritebackProcessedTime');
$bcp.ColumnMappings.Add('DiagStatus','DiagStatus');
$bcp.ColumnMappings.Add('AccountingPeriodCase_PK_ID','AccountingPeriodCase_PK_ID');
if ($connection.State -ne [Data.ConnectionState]::Open) {
'Connection to DB is not open.'
Exit
}
$bcp.WriteToServer($dt); #writing to server
$connection.Close();
我面临的错误是:
Exception calling "WriteToServer" with "1" argument(s): "The given value of type String from the data source cannot be converted to type uniqueidentifier of the specified target column." At C:\Documents\DCT\SavedScripts\XMLtoDB\AccountingPeriodCases\sample.ps1:91 char:1
+ $bcp.WriteToServer($dt); #writing to server
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : InvalidOperationException
我创建的表中有数据类型为的列:
问题是,我想我需要转换列ScheduleId和AccountingPeriodCase_PK_ID下datatable中的字符串,因为它们没有转换为uniqueidentifier
我试着用
[System.Guid]::Parse($dt.Columns[4])代码>
[System.Guid]::Parse($dt.Columns[24])代码>
但错误会重演
要在thr ScheduleId和AccountingPeriodCase_PK_ID下加载的xml内容如下所示:
<ScheduleId>db6f3178-4702-456c-904b-2cd833b54efa</ScheduleId>
<AccountingPeriodCase_PK_ID>9544940d-8d1a-e711-80d3-0050569c2fb6</AccountingPeriodCase_PK_ID>
db6f3178-4702-456c-904b-2cd833b54efa
9544940d-8d1a-e711-80d3-0050569c2fb6
谁能帮我解决这个问题?
感谢您我之前遇到过一个问题,这要归结到您的意见来源
问题是,如果您从XML
文件中读取,那么您肯定会得到一个错误,因为在从平面文件(txt,csv)
或XML
读取时,PowerShell
会将未定义的类型解析为字符串。诀窍是对源代码进行某种控制。如果源是PowerShell
变量,如datatable
或数组
,则可以直接将此变量中的值插入目标表,因为表中列的原始数据类型将保留
这就是我所遵循的方法。在我的例子中,源代码是调用Sqlcmd
的结果,它保留了原始数据类型,因此减少了插入错误
同样,正如OP在评论中提到的,他是基于列
而不是行
来解析值的。这也可能导致错误。例如,在使用INSERT
语句的表中插入值还有一种方法。请注意,sqlserver
INSERT
语句在行级别而不是列级别插入值。在这种情况下,解析值列可能会失败。失败的字符串是什么格式?它们应该看起来像一个典型的GUID(例如,39FD3A0E-B4F2-4969-863D-A790ED7F72E5
)。如果字符串为空,则应改为提供空GUID(例如,00000000-0000-0000-0000-000000000000
),我遇到了类似的情况。你看。稍微调整一下可能对您有用。@boxdog我添加了一个要加载的示例信息的示例。@VivekKumarSingh我会尝试一下,但错误仍然存在。。另外,我对这个领域还很陌生,刚开始使用脚本,所以对东西不太熟悉,如果我出了问题或错过了任何一点,请务必帮助我。。谢谢你的回复。。。我会尝试再读一遍,然后尝试一下……@ VikkkUMARSIGH,考虑添加你的评论作为答案,所以它对未来读者更为可见。