2017-02-20 76 views
2

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

我们有一个函数可以建立一个记录,插入这张表中,该表不再与表的链接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 

末次

+0

我试图在SQL字符串中使用NEWID(),但是当进入运行db.execute声明,我得到一个错误:在表达“未定义功能‘NEWID’ – ArcherBird

回答

2

你可以添加在SQL Server表上的默认约束为该列像这样:

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

或者你可以使用自定义功能访问生成的GUID像stguidgen()

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

随着传递查询,你可以使用newid()这在SQL Server生成一个新的uniqueidentifier

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

添加表约束为我工作很好谢谢各位的建议! – ArcherBird

+0

@ArcherBird乐意帮忙! – SqlZim