Sql server 无法将数据源中类型字符串的给定值转换为指定目标列的类型uniqueidentifier

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

我在这里尝试的是,使用PowerShell脚本将数据从.xml文件加载到SQL server数据库

我的剧本是这样的:

$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,考虑添加你的评论作为答案,所以它对未来读者更为可见。