从包含日期/时间数据类型的访问表更新SQL Server表

时间:2014-11-18 16:53:53

标签: sql-server sql-server-2012 odbc ms-access-2013

我在将一些现有数据从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上更新。

2 个答案:

答案 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");