【问题标题】:How to pass values from VBA to a table variable in SQL Server 2008?如何将值从 VBA 传递到 SQL Server 2008 中的表变量?
【发布时间】:2012-05-02 12:18:23
【问题描述】:

我在 Excel 2007 中有一个用户表单,它使用存储过程将数据写入 SQL Server 2008 上的表中。

然后插入的行得到一个我报告给 VBA 的标识。然后我使用这个数字将几行数据填充到另一个表中。

但是,我不想让存储过程先执行然后写入另一个表,而是让存储过程同时做这两件事。

问题是,另一个表的条目包含大于一行,而我从 VBA 发送到 SQL 的参数只能包含一个值。

所以,我相信我需要在 SQL 中创建一个表变量。但是,如何将 VBA 中的值传递给 SQL 中的表变量?请记住,一切都应该在一个存储过程中完成。这就是我到目前为止所拥有的。

感谢您的帮助!!!

--SQL Stored Procedure
ALTER procedure [dbo].[Audit_InsertAuditFinding]

 @AuditRID as int 
,@EnteredBy as varchar(10)  
,@AuditItemNumber as int 
,@AuditFindingShort as varchar(50) 
,@AuditFindingLong as varchar(500)  
,@AuditDocsSaved as bit
,@AuditIncident as int output

as
BEGIN
SET NOCOUNT ON
Insert Into Audit_Findings 
Values (@AuditRID,@EnteredBy,GETDATE(),@AuditItemNumber,@AuditFindingShort,@AuditFindingLong,@AuditDocsSaved)

declare @AuditFindingNumber as int
select @AuditFindingNumber = MAX(@@IDENTITY)

select @AuditIncident = @AuditFindingNumber
END

到目前为止,这是我的 VBA 代码。

--VBA Code
cnn.CursorLocation = adUseClient
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "InternalReporting.dbo.Audit_InsertAuditFinding"
cmd.NamedParameters = True
Set prm = cmd.CreateParameter("@AuditRID", adInteger, adParamInput, 50, Audit_Topic.Value * 1)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@EnteredBy", adVarWChar, adParamInput, 10, Environ("UserName"))
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@AuditItemNumber", adInteger, adParamInput, 10, Audit_ItemNumber.Value * 1)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@AuditFindingShort", adVarWChar, adParamInput, 50, Audit_ShortDescr.Value)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@AuditFindingLong", adVarWChar, adParamInput, 500, Audit_LongDescr.Value)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@AuditDocsSaved", adVarWChar, adParamInput, 500, Doc_Saved)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@AuditIncident", adVarWChar, adParamOutput, 10, Incident_Number.Value)
cmd.Parameters.Append prm

cmd.Execute

Incident_Number.Value = cmd.Parameters("@AuditIncident") * 1
SQL_String = "Delete from InternalReporting.dbo.Audit_Findings_Notifications where Audit_Incident = " & Incident_Number.Value * 1

rst.Open SQL_String, cnn, adOpenStatic
   Set rst = Nothing

   With AUD_02_Item_Mgmt.Notify_Overview
    For I = 1 To .ListCount
        SQL_String = "Insert Into InternalReporting.dbo.Audit_Findings_Notifications " & _
                     "Values (" & Incident_Number.Value & ",'" & .List(I - 1, 0) & _
                     "','" & .List(I - 1, 2) & "')"
        rst.Open SQL_String, cnn, adOpenStatic
        Set rst = Nothing
    Next I
End With`

【问题讨论】:

  • 不确定您在追求什么,但我注意到您的 ADO 参数中定义的数据类型与存储过程参数不同。我过去曾遇到过此类问题,因此需要注意一些事情(如果它还没有给您带来问题)。这可能会有所帮助:w3schools.com/ado/ado_datatypes.asp
  • 嘿,是的,可能是这样。我会协调它们,但是如何将 vba 中的多个值传递到 SQL 中的表变量中。我不知道从哪里开始。

标签: sql excel vba


【解决方案1】:

我认为这对于普通/经典 ADO 是不可能的,因为没有表变量数据类型。

另一种方法是构建一个 XML 数据字符串,然后在您的存储过程中对其进行解析。

【讨论】:

    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多