从MS Access插入带有GUID pk的SQL Server表

时间:2017-02-20 18:03:21

标签: sql-server vba ms-access

我正在将数据库从Access后端移动到SQL Server后端,同时保持Access前端。其中一个表设置了PK的复制ID。作为访问数据库,我们可以在不引用PK字段的情况下将值插入此表,因为Access会自动生成新的GUID。

我们有一个函数可以构建一个插入此表的记录,该记录不再适用于表的链接SQL Server版本,我非常确定它必须与此replcationID字段有关。在SQL Server中,它作为数据类型导入uniqueidentifier'。当函数运行时,它不返回任何错误,但也不会插入任何错误。

我想知道是否有办法让这项工作无需改变为直通。如何在插入新记录时让MS Access告诉SQL Server生成新的GUID。

作为旁注,PK字段称为PurchaseID,并且当前未在vba中引用(因为它曾用于为此字段自动生成)

Public Sub BuildReorderRecord(Market As String, MPID As String, FloorsetID As String)
Dim values As String
Dim sql As String
Dim P3ID As String
Dim Username As String
Dim dt As String
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT ID FROM tblAttributes WHERE MPID = """ & MPID & """")

    'Get P3ID and auditing values
    dt = Now()
    Username = Environ("USERNAME")
    P3ID = rs![ID]

    'build record values string
    values = """" & P3ID & """, """ & Market & """, """ & MPID & "', """ & FloorsetID & """"
    values = values & ", #" & dt & "#, """ & Username & """, #" & dt & "#, """ & Username & """"

    'build sql string
    sql = "INSERT INTO tblReorders (P3ID, country, mpid, floorsetID"
    sql = sql & ", CreateDate, CreatorUsername, ChangeRecord_Timestamp, ChangeRecord_Username)" & vbNewLine
    sql = sql & "VALUES(" & values & ")"

    'insert the new record
    db.Execute sql

Set db = Nothing
Set rs = Nothing

End Sub

1 个答案:

答案 0 :(得分:2)

您可以在sql server中为该列添加默认约束,如下所示:

alter table t 
  add constraint [df_t_guid]
    default newid() for [guid];

或者你可以在访问中使用自定义函数来生成像stguidgen()

这样的guid
insert into ... (guid...
values (stguidgen(), ...)

使用传递查询,您可以使用newid()在sql server中生成新的uniqueidentifier

insert into ... (guid...
values (newid(), ...)