背景:使用前端 Ms-Access 2010 和后端 SQL Server 2008 Management Studio
为了执行存储过程,我一直使用一个相当漫长的过程,如下所示:in VBA
Set Conn = New ADODB.connection
Conn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;....."
Conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = Conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "upGetTestIdForAnalyte"
cmd.Parameters.Append cmd.CreateParameter("@WOID", adVarChar, adParamInput, 60, MySampleName)
cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, MyAnalyte)
cmd.Parameters.Append cmd.CreateParameter("@SampleID", adVarChar, adParamInput, 60, MyConcentration
cmd.Execute
Conn.Close
有人告诉我有一种更好的方法来执行存储过程,正确的方法是这样的:in VBA
strsql = "Exec upGetTestIdForAnalyte(WOID, Analyte, SampleID)"
test = ExecuteNonQuery(strsql)
但我在这个过程中遇到了很多错误,我查找了 ExecuteNonQuery,它说它仅适用于 VB (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx)。此过程的优点之一是其简洁性以及它自动连接到当前数据库的事实。我必须更改当前 sp 进程中的连接字符串,因为它设置为链接到测试数据库而不是实际数据库。另一个优点是它在执行时返回一个值。我希望我当前的进程能够执行此操作,因为我想以某种方式验证它的运行情况,并且我需要执行的其他存储过程需要返回受影响的记录数。
我的问题是:第二种方法是合法的过程吗?这是正确的语法吗?每个过程完成的任务有什么不同吗?还有没有办法让第一个进程在执行时返回一个值?感谢您的时间。
UPDATE:这是我当前正在处理的存储过程。我的 sp 查看 testID 是否存在,如果变量 ThisTestId >0,我将在调用 sp 后继续执行该程序,否则我将引发错误 testid not found
CREATE PROCEDURE upGetTestIDForAnalyte @WOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @Test var(20) output
AS
SELECT TestID = t1.TestID
FROM tblWOSampleTest t1
JOIN tblTest t2
ON t1.TestID=t2.TestID;
WHERE @WOID = t1.WOID AND @SampleID = t1.SampleID AND @Analyte = t2.Analyte
GO