我在将一些现有数据从Access后端表传输到SQL Server 2012后端表时遇到问题。我正在调整我们的数据库大小,并且由于我们的Access数据库依赖于我们的ERP软件上的表,这也是SQL Server上的,所以在SQL服务器上运行所有查询并且仅通过ODBC从SQL Server中检索Access中的信息是有意义的。
这是问题所在。当尝试将所有字段从StatusT(访问表)更新到dbo_StatusT(SQL Server表)时,它仅在我省略日期/时间数据类型列时才有效。我在更新查询中引入日期/时间数据类型的那一刻,它说超过13000行无法更新,但最后它不会复制任何内容。如果我从查询中省略了日期/时间字段,则其余数据将轻松传输。
ACCESS SQL Server
Field Name Data Type Column Name Data Type
OrderID Number OrderID int
LoadID Number LoadID int
StepNumber Number StepNumber smallint
InProgress Yes/No InProgress bit
Completed Yes/No Completed bit
TimeStamp Date/Time TimeStamp datetime
TimeStamp_Completed Date/Time TimeStamp_Completed datetime
据我所知,我的表格在两端都设置正确,SQL Server中的日期时间数据类型应该与Access中的日期/时间数据类型一起使用。
当我尝试将数据从Access移动到SQL Server时,我在访问时遇到以下错误。
Microsoft Access didn't update 13243 field(s) due to a type conversion failure, 0, record(s) due to key violations, 0 record(s) due to lock violations, and 0 record(s) due to validation rule violations.
这是我的查询。
UPDATE StatusT INNER JOIN dbo_StatusT ON (StatusT.StepNumber = dbo_StatusT.StepNumber) AND (StatusT.LoadID = dbo_StatusT.LoadID) AND (StatusT.OrderID = dbo_StatusT.OrderID) SET dbo_StatusT.Completed = IIf([StatusT].[Completed]=-1,1,0), dbo_StatusT.InProgress = IIf([StatusT].[InProgress]=-1,1,0), dbo_StatusT.[Timestamp] = [StatusT].[Timestamp], dbo_StatusT.Timestamp_Completed = [StatusT].[Timestamp_Completed];
由于SQL Server中的位表示,我调整了Yes / No字段以使用1和0,但我无法弄清楚日期/时间问题。 OrderID,LoadID和StepNumber是每一方都相同的字段,其余数据需要在SQL Server上更新。
答案 0 :(得分:1)
我的结局是一个很大的愚蠢错误。我对表做了一些更改,但我从未在Access中重新链接我的表。这意味着它仍然偏离MS SQL Server中先前表配置中设置的数据类型。我刷新桌子的那一刻,一切都没有任何问题。谢谢你的帮助。
答案 1 :(得分:0)
我建议将Access中的日期/时间转换为字符串 - 也许MS SQL可以读取这个:
UPDATE StatusT
INNER JOIN dbo_StatusT ON (StatusT.StepNumber = dbo_StatusT.StepNumber)
AND (StatusT.LoadID = dbo_StatusT.LoadID)
AND (StatusT.OrderID = dbo_StatusT.OrderID)
SET dbo_StatusT.Completed = IIf([StatusT].[Completed]=-1,1,0),
dbo_StatusT.InProgress = IIf([StatusT].[InProgress]=-1,1,0),
dbo_StatusT.[Timestamp] = FORMAT([StatusT].[Timestamp], "yyyymmdd hh:mm:ss"),
dbo_StatusT.Timestamp_Completed = FORMAT([StatusT].[Timestamp_Completed], "yyyymmdd hh:mm:ss");