【发布时间】:2019-11-21 10:29:01
【问题描述】:
专家们下午好!
我遇到了与平时截然不同的问题。过去,我通过“通过查询”将单行传递给服务器,有时当我需要传递多条记录时,我利用循环函数多次将数据发送到服务器。但是,如果我有超过 40 行记录,则该循环将需要相当长的时间才能完成。我只是想知道是否有一种方法可以在 1 次移动中将表集发送到服务器,而不是使用循环移动 X 次。
这是我在 Access 端使用的附加到表单内按钮的代码(记录源是本地访问表):
Dim db As dao.Database
Dim rs As dao.Recordset
Dim qdf As dao.QueryDef
Dim strSQL As String
Set db = CurrentDb
Set rs = Me.Recordset
rs.MoveLast
rs.MoveFirst
Do While Not rs.EOF
Set qdf = db.QueryDefs("Qry_Send_ClientData") 'local pass through query
strSQL = "EXEC dbo.SP_Client_Referral @JunctionID='" & Me.ClientID & "', @Note='" & Replace(Me.Txt_Note, "'", "") & "', @Value1='" & Txt_Value1 & "', @Value2='" & Txt_Value2 & "'"
qdf.SQL = strSQL
db.Execute "Qry_Send_ClientData"
rs.MoveNext
Loop
Msgbox "All Client Added!", , "Add client"
现在在 SQL 服务器端,我有以下存储过程 (dbo.SP_Client_Referral),它接收来自传递查询的数据并将代码行插入到特定表中
@ClientID AS NVARCHAR(15),
@Note As NVARCHAR(500),
@Value1 As NVARCHAR(50),
@Value2 As NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO dbo.Client_Data(ClientID, Note, Value_1, Value_2)
SELECT @ClientID, @Note, @Value1, @Value2
END
END
对于单条记录甚至多达 10 条记录,此方法相对较快。然而,随着记录数量的增加,所需的时间可能会很长。如果有一种方法可以将表(即使用 SELECT * from LocalTable 的访问端)传递到 SQL 服务器而不是逐行传递肯定会节省大量时间。只是想知道这种方法是否存在,如果存在,我将如何发送表以及我必须在 SP 的 SQL 服务器端使用什么来接收表记录。或者,我可能必须继续使用这种单行方法,并可能使其更高效,以便执行得更快。
非常感谢您的帮助!
【问题讨论】:
-
请了解参数化。您在该声明中存在一些巨大的注入问题。
-
您可以使用 VBA 代码创建 JSON(SQL-Server 2016+)或 XML(较低版本)并将其作为单个参数传递。然后您可以使用 SQL-Server 处理 JSON/XML 的能力一次性插入所有内容。
-
那个 SP 是实际的代码,还是实际的 SP 更多地处理数据?看到这么多用于这样一个基本任务的代码(将记录从本地表插入服务器表)让我很痛苦。是否有理由不在 Access 中使用链接表?
-
感谢 cmets,我没有使用链接表,因为如果我能提供帮助,我不希望用户在访问级别上与实际 SQL 表进行交互。我希望通过 SP 与表进行交互,以减少可能出错的问题的数量。因此 SP 并通过查询。我会看看 JSON/XML 选项,看看这是否可行:) 感谢您的提示
标签: sql-server tsql ms-access pass-through