Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否让ADO为临时存储过程生成参数?_Sql Server_Vba_Vb6_Ado - Fatal编程技术网

Sql server 是否让ADO为临时存储过程生成参数?

Sql server 是否让ADO为临时存储过程生成参数?,sql-server,vba,vb6,ado,Sql Server,Vba,Vb6,Ado,我试图让ADO识别SQL Server上存储过程中的参数。如果我使用正常的存储过程执行此操作,它可以正常工作: conn.Execute "create proc NormalSP (@i int output) as set @i = 3" cmd.CommandType = adCmdStoredProc cmd.ActiveConnection = conn cmd.CommandText = "NormalSP" cmd.Parameters.Refresh 'parameters li

我试图让ADO识别SQL Server上存储过程中的参数。如果我使用正常的存储过程执行此操作,它可以正常工作:

conn.Execute "create proc NormalSP (@i int output) as set @i = 3"
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = conn
cmd.CommandText = "NormalSP"
cmd.Parameters.Refresh 'parameters list now has @RETURN_VALUE and @i
cmd.Execute
Debug.Print cmd("@i")
但是,如果我对临时存储过程进行同样的尝试,它将无法获得以下参数:

conn.Execute "create proc #TempSP (@i int output) as set @i = 3"
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = conn
cmd.CommandText = "#TempSP"
cmd.Parameters.Refresh 'parameters list remains empty
cmd.Execute 'error: command expects parameter '@i', which was not supplied
Debug.Print cmd("@i") 'error: item cannot be found in the collection

我还需要什么来获取
参数。刷新
才能像处理普通SP一样处理临时SP?

尝试将其设置为全局临时SP:

conn.Execute "create proc ##TempSP (@i int output) as set @i = 3"
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "##TempSP"
cmd.Parameters.Refresh 'parameters list remains empty
cmd.Execute
Debug.Print cmd("@i")
Put
cmd.Parameters(1).Value=intYourValue
cmd.Execute

之前,询问两个黑匣子(遗留ADO,OLEDB/ODBC提供程序)为什么他们不喜欢您对应该公开的上下文的解释可能不会提供一个非常令人满意的答案,但由于原意尚不清楚

假设您可以接受一个短期的全局临时存储过程来请求它提供临时参数(与上面假定的向下投票相反),只需首先连接到正确的数据库:

完成,重复安全示例(使用SQL 2012本机客户端):

即时窗口输出

@RETURN_VALUE: 
@i: 
cmd.Parameters.Count: 2
 3 
一些有用的

@RETURN_VALUE: 
@i: 
cmd.Parameters.Count: 2
 3 
连接到早期版本时,临时存储过程非常有用 不支持重复使用执行的SQL Server版本 Transact-SQL语句或批处理的计划。应用程序连接 对于SQL Server 2000及更高版本,应使用sp_executesql系统 存储过程而不是临时存储过程

如果直接在中创建了不带#或##前缀的存储过程 在tempdb数据库中,存储过程将自动删除 由于每次都重新创建tempdb而关闭SQL Server时 SQL Server已启动。直接在tempdb中创建的过程存在 即使在创建连接终止之后

当然,这意味着,如果您在第27行周围的VBA示例中抛出一个断点,切换到SSMS,连接到
(本地)
,切换到
tempdb
,以及
EXEC TempSP
,您将被告知

过程或函数“TempSP”需要参数“@i”,而参数不是 供应

而不是

找不到存储过程“TempSP”


示例执行前后。

conn和cmd是否使用相同的连接?一旦使用临时对象的连接关闭,它就会被删除。是的,如果手动添加所有参数,我可以执行SP。只是
参数。Refresh
找不到它们。这是一个有趣的问题,但为什么需要发现客户机刚刚创建的存储过程的参数呢?假设.Refresh方法不起作用:您想实现什么?如果是全局SP,参数列表仍然为空。好吧,我不确定,但我认为值得一试。我没有任何其他想法来证明我的清白!谢谢downwitch。我没有在tempdb中创建正常SP的权限。如果我这样做了,我就会这样做,因为正常的SP已经可以工作了。@rdhs没有哈希符号但直接在tempdb中创建的SP不是“正常的”,正如MSFT引号直接指出的那样。这是一个全球性的临时SP。也许您应该事先说明您的限制(以及您的意图)。这个答案直接而彻底地回答了你的问题。对你有好处,我相信你一定非常自豪。@rdhs应该授予你“坏态度”徽章