我正在将Access查询中的数据追加到SQL Server(2019)中的现有表中,有时NULL值会导致“记录已删除”消息框(无错误号)。
例如,我有3列(Text 1,Text 2,Text 3)都是nvarchar(255),Text 1接受NULL值,但有时Text 2不接受...它们实际上是相同的字段,具有相同的数据。SQL Server中的列和查询中的字段绝对没有任何不同。
另一件事是,我做了一个生成表查询关闭查询和使用新表而不是查询造成的问题,在所有!为什么会这样?以及我如何让查询追加数据一致?
我在DoCmd.RunSQL中尝试过追加查询和直接SQL
SqlSRV表通过链接表管理器中的自定义ODBC字符串连接。
来自查询;这会产生错误:
INSERT INTO tmakContact ( DataAsOf, ContactId, FullName, LoanNum, LoanId, Name, JobTitle, Email, Relationship, Company, Address, CityStateZip, [Number], PhoneNumType )
SELECT DataAsOf, ContactId, FullName, LoanNum, LoanId, Name, JobTitle, Email, Relationship, Company, Address, CityStateZip, [Number], PhoneNumType
FROM qryContact;
当我取出“Relationship”和“PhoneNumType”字段时,此查询的INSERT操作正常。这两个字段来自外部联接表。这些表来自另一个SQL Server和数据库,我通过链接表管理器中的自定义ODBC字符串从Access中链接到这些数据库。
从一个表,我在一个表查询从qryContact没有给出错误!
INSERT INTO tmakContact ( DataAsOf, ContactId, FullName, LoanNum, LoanId, Name, JobTitle, Email, Relationship, Company, Address, CityStateZip, [Number], PhoneNumType )
SELECT DataAsOf, ContactId, FullName, LoanNum, LoanId, Name, JobTitle, Email, Relationship, Company, Address, CityStateZip, [Number], PhoneNumType
FROM tmptblContact;
最初,我只是运行了DoCmd.OpenQuery "apdContact"
,它不起作用,它只是一个使用与上面相同的代码保存的追加查询。
qry联系人的SQL:
SELECT Now() AS DataAsOf, dbo_Contact.Id AS ContactId, dbo_UserInfo.FullName, dbo_Loaninfo.LoanNum, dbo_ContactLoanLink.LoanId, dbo_Contact.Name, dbo_Contact.JobTitle, dbo_Email.Addr AS Email, Trim([dbo_ContactRelationship]![Descr]) AS Relationship, dbo_Contact.Company, [Add1] & " " & [Add2] AS Address, StrConv([City],3) & ", " & [StateCode] & " " & [Zip] AS CityStateZip, qryPhone.Number, qryPhone.PhoneNumType
FROM ((((dbo_Loaninfo INNER JOIN ((dbo_ContactLoanLink INNER JOIN dbo_Contact ON dbo_ContactLoanLink.ContactId = dbo_Contact.Id) LEFT JOIN dbo_Address ON dbo_Contact.BusAddrAId = dbo_Address.Id) ON dbo_Loaninfo.Id = dbo_ContactLoanLink.LoanId) LEFT JOIN dbo_ContactRelationship ON dbo_ContactLoanLink.ContactRelationshipId = dbo_ContactRelationship.Id) LEFT JOIN dbo_Email ON dbo_Contact.Id = dbo_Email.ContactId) LEFT JOIN qryPhone ON dbo_Contact.Id = qryPhone.ContactId) LEFT JOIN dbo_UserInfo ON dbo_Loaninfo.AssignedUserId = dbo_UserInfo.Id
WHERE (((dbo_Contact.InactiveFlag)="N") AND ((dbo_Loaninfo.LoanStatusId)<>1105) AND ((dbo_Loaninfo.InactiveFlag)="N") AND ((dbo_Loaninfo.PaidOffFlag)="N"));
1条答案
按热度按时间omqzjyyz1#
Hum,有问题的表是否有任何真/假列-即使在您的查询中没有使用?(表中的位列?)。
两次、三次检查SQL Server中的目标表(无疑是Access的链接表)是否有任何位列,如果有,请确保该列有默认值(0),否则为false。
接下来:您没有提到目标表是否有自动编号PK列(我怀疑它一定有--但是一定要检查,并确保这样的表有PK)。
接下来:它们在目标表中是真实的列还是单/双列--同样,即使它们不是查询的一部分,也要确保这些列在sql server(0)中有默认设置。
last up:在sql server目标表中添加一个行版本列。2 sql中所谓的“行版本”列被命名为timestamp。3(这是世界上最糟糕的名字,因为timestamp列中的“时间”、“日期”或其他什么都是零。4这是一个实际的行版本系统,access支持这个特性。
这也意味着access在执行更新或插入操作时不会对记录进行逐列比较。因此,请尝试添加时间戳(又名:行版本)列到目标表,并从access重新链接。