在 VBA 中导出存储过程的参数
Derive parameters of a stored procedure in VBA
我已经尝试搜索了很多地方,但无法完全找到我要找的东西。
我想在 vba 中编写一个子例程,它将告诉我存储在 SQL 服务器上的存储过程的参数。
我知道如何使用 excel vba 中的参数执行存储过程。我已经编写了一个存储过程,它采用存储过程名称和 returns 参数。所以我可以用这个。但我想也许有一种我不知道的更好的方法。我为 VB 找到了一个 SQLCommandBuilder Class,它非常完美,但我在 VBA 中需要它。这在 VBA 中可用吗,我只是不知道在哪里激活它?
谢谢
**附加信息:在下面的有用评论之后,我离我的目标越来越近了。
我希望能够将任何存储过程传递到我的子例程中,它能够计算出它需要多少参数以及它们是什么
到目前为止,这是我的代码
Private Sub execStoredProcedureWithParameters(strServer As String,
strDatabase As String, strSchema As String, strUSPName As String)
'Declare variables
Dim cmd As ADODB.Command
Dim conn As ADODB.Connection
Dim prm As ADODB.Parameter
Dim rs As ADODB.Recordset
Dim intParamCount As Integer
'Open database connection
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=sqloledb;Data Source=" + strServer + ";Initial Catalog=" + strDatabase + ";Integrated Security=SSPI;"
conn.CommandTimeout = 0
'Here's where the connection is opened.
conn.Open
'This can be very handy to help debug!
'Debug.Print conn.ConnectionString
Set cmd = New ADODB.Command
With cmd
.CommandText = strSchema + "." + strUSPName
.CommandType = adCmdStoredProc
.ActiveConnection = conn
.Parameters.Refresh
For intParamCount = 0 To .Parameters.Count - 1
Debug.Print .Parameters(intParamCount).Name, .Parameters(intParamCount).Type, .Parameters(intParamCounti).Size, .Parameters(intParamCount).Attributes, .Parameters(intParamCount).NumericScale
' Set prm = cmd.CreateParameter(.Parameters(i).Name, adVarChar, adParamInput, 255)
' cmd.Parameters.Append prm
' cmd.Parameters(.Parameters(i).Name).Value = "DBName"
Next
End With
Set rs = New ADODB.Recordset
'Execute the Stored Procedure
Set rs = cmd.Execute
'Populate the sheet with the data from the recordset
Sheet1.Range("RecordSet").CopyFromRecordset rs
'Cleanup
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub
关于参数。有没有办法将 DataTypeEnum 从值转换为常量。因此,第一个参数的类型当前为 202,我将根据此 table
将其设置为 adVarWChar
https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum
您可以使用 ADODB 执行此操作,添加对 Microsoft ActiveX 数据对象的引用,然后您可以:
With New ADODB.Command
Set .ActiveConnection = myAdoDbConnection
.CommandText = "[dbo].[usp_XXX]"
.CommandType = adCmdStoredProc
.Parameters.Refresh
For i = 0 To .Parameters.Count - 1
Debug.Print .Parameters(i).Name, .Parameters(i).Type, .Parameters(i).Direction
Next
End With
应该有必要这样做,因为它需要往返服务器。
我已经尝试搜索了很多地方,但无法完全找到我要找的东西。
我想在 vba 中编写一个子例程,它将告诉我存储在 SQL 服务器上的存储过程的参数。
我知道如何使用 excel vba 中的参数执行存储过程。我已经编写了一个存储过程,它采用存储过程名称和 returns 参数。所以我可以用这个。但我想也许有一种我不知道的更好的方法。我为 VB 找到了一个 SQLCommandBuilder Class,它非常完美,但我在 VBA 中需要它。这在 VBA 中可用吗,我只是不知道在哪里激活它?
谢谢
**附加信息:在下面的有用评论之后,我离我的目标越来越近了。 我希望能够将任何存储过程传递到我的子例程中,它能够计算出它需要多少参数以及它们是什么
到目前为止,这是我的代码
Private Sub execStoredProcedureWithParameters(strServer As String,
strDatabase As String, strSchema As String, strUSPName As String)
'Declare variables
Dim cmd As ADODB.Command
Dim conn As ADODB.Connection
Dim prm As ADODB.Parameter
Dim rs As ADODB.Recordset
Dim intParamCount As Integer
'Open database connection
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=sqloledb;Data Source=" + strServer + ";Initial Catalog=" + strDatabase + ";Integrated Security=SSPI;"
conn.CommandTimeout = 0
'Here's where the connection is opened.
conn.Open
'This can be very handy to help debug!
'Debug.Print conn.ConnectionString
Set cmd = New ADODB.Command
With cmd
.CommandText = strSchema + "." + strUSPName
.CommandType = adCmdStoredProc
.ActiveConnection = conn
.Parameters.Refresh
For intParamCount = 0 To .Parameters.Count - 1
Debug.Print .Parameters(intParamCount).Name, .Parameters(intParamCount).Type, .Parameters(intParamCounti).Size, .Parameters(intParamCount).Attributes, .Parameters(intParamCount).NumericScale
' Set prm = cmd.CreateParameter(.Parameters(i).Name, adVarChar, adParamInput, 255)
' cmd.Parameters.Append prm
' cmd.Parameters(.Parameters(i).Name).Value = "DBName"
Next
End With
Set rs = New ADODB.Recordset
'Execute the Stored Procedure
Set rs = cmd.Execute
'Populate the sheet with the data from the recordset
Sheet1.Range("RecordSet").CopyFromRecordset rs
'Cleanup
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
End Sub
关于参数。有没有办法将 DataTypeEnum 从值转换为常量。因此,第一个参数的类型当前为 202,我将根据此 table
将其设置为 adVarWCharhttps://docs.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum
您可以使用 ADODB 执行此操作,添加对 Microsoft ActiveX 数据对象的引用,然后您可以:
With New ADODB.Command
Set .ActiveConnection = myAdoDbConnection
.CommandText = "[dbo].[usp_XXX]"
.CommandType = adCmdStoredProc
.Parameters.Refresh
For i = 0 To .Parameters.Count - 1
Debug.Print .Parameters(i).Name, .Parameters(i).Type, .Parameters(i).Direction
Next
End With
应该有必要这样做,因为它需要往返服务器。