Sql server 从VBA调用存储过程

Sql server 从VBA调用存储过程,sql-server,excel,vba,Sql Server,Excel,Vba,我对SQL和VBA非常陌生,我在SQL Server中编写了以下查询: ALTER PROCEDURE SP_insert_search_archive @IP_Address VARCHAR(20), @DT VARCHAR(30), @search_word VARCHAR(50), @search_time TIME AS INSERT INTO Search_Archive values (@IP_Address, @DT, @sea

我对SQL和VBA非常陌生,我在SQL Server中编写了以下查询:

ALTER PROCEDURE SP_insert_search_archive 
    @IP_Address VARCHAR(20),
    @DT VARCHAR(30), 
    @search_word VARCHAR(50), 
    @search_time TIME
AS
    INSERT INTO Search_Archive
    values (@IP_Address, @DT, @search_word, @search_time);
现在我想在VBA(Excel)中执行此存储过程:

当我激活宏时,出现以下错误:

运行时错误“-2147217900(80040e14)”:

过程或函数SP_insert_search_archive指定的参数太多


您确定已在“主”数据库中创建此存储过程吗?你能查一下这条线路吗?con.Open“Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;Integrated Security=SSPI;Trusted_Connection=Yes;”旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!是的,我已经检查过了,SP确实在“master”数据库下。您可以尝试在任何其他数据库中创建存储过程吗?我运行了您的代码,但出现了另一个错误,“将数据类型转换为时间时出错”。ADO和传统的SQLOLEDB提供程序只知道SQL 2000世界中的数据类型,因此您需要将时间值转换为服务器端
time
参数的“HH:mm:ss”格式的字符串。
Dim StartTime As Double
Dim SecondsElapsed As Double

Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim par As String
Dim WSP1 As Worksheet
Set con = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset
StartTime = Timer

Application.DisplayStatusBar = True
Application.StatusBar = "Contacting SQL Server..."
con.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=master;Integrated Security=SSPI;Trusted_Connection=Yes;"
cmd.ActiveConnection = con
SecondsElapsed = Round(Timer - StartTime, 4)
Dim search_word As String
search_word = Range("D2").Text
Dim IP As String
IP = GetMyPublicIP

cmd.Parameters.Append cmd.CreateParameter("IP", adVarChar, adParamInput, 20, IP)
cmd.Parameters.Append cmd.CreateParameter("DT", adVarChar, adParamInput, 30, Now)
cmd.Parameters.Append cmd.CreateParameter("Search Word", adVarChar, adParamInput, 50, search_word)
cmd.Parameters.Append cmd.CreateParameter("Search Time", adVarChar, adParamInput, 20, SecondsElapsed)
cmd.CommandText = "SP_insert_search_archive"
Set rs = cmd.Execute(, , adCmdStoredProc)

rs.Close
Set rs = Nothing
Set cmd = Nothing
MsgBox (DT)
con.Close
Set con = Nothing