【发布时间】:2013-01-09 07:23:37
【问题描述】:
在这里和网上做了一些研究后,我不知道这是否可能。我想要做的是调用一个存储过程,它有几个参数,其中一个是表值参数。
这是我的存储过程sn-p:
ALTER PROCEDURE [dbo].[procName]
@Action nvarchar(10) = 'view'
,@var1 int = 0
,@var2 int = 0
,@var3 myType ReadOnly
我现在有另一个过程 (proc2),其中包含以下几行:
insert into @varX
select top 5
field1, field2
from
sourceTable
print 'Processing from table values...'
exec dbo.procName 'refresh', -1, 0, @varX
请注意,varX 和 var3 属于同一类型 MyType 当我执行 proc2 时,我收到错误,我为 dbo.procName 指定了太多参数
我认为不可能为存储过程指定多个参数,包括表值参数。我现在倾向于将我的 procName 定义更改为只有一个参数(正如所有在线示例似乎都有),并让我的表值参数充当参数值数组,包括我在我的信息上一个 select 语句(在 proc2 中)。但是,如果可以进行此调用,请说明如何进行。
谢谢
【问题讨论】:
-
如果你明确地命名你的参数会发生什么(无论如何这是一个好习惯)?
exec dbo.procName @Action = 'refresh'等。您收到的错误消息通常是编码错误或拼写错误的结果,明确命名参数是发现这一点的好方法。正如 Damien 建议的那样,您也可以像他一样尝试使用一些测试代码重新创建此错误;如果您无法重现该错误,那么您的调用代码可能有问题。如果您真的找不到任何东西,那么使用 SQL Profiler 检查正在执行的代码可能会有所帮助。 -
@Pondlife 是的,我可以重新创建错误,并且我之前明确命名了我的参数。如果您尝试第一个参数是 nvarchar 然后是 tvp 和其他参数的示例,您也会收到错误
-
您能否复制并粘贴您的独立测试脚本 - 就像 Damien 回答中的那个 - 重新创建错误,以便其他人可以将其复制并粘贴到 SSMS 中并尝试?
-
@Pondlife 不幸的是没有 - 我想出了一个解决方法,即创建另一个只接受 TVP 的 SP 和另一个接受所有 INT 和 TVP 的 SP。这样可行。在 NVARCHAR 的情况下,然后得到指定太多参数的错误(即使它们被命名)仍然令人困惑。完成项目后我会进行研究并在此处发表评论。
标签: sql-server-2008 stored-procedures table-valued-parameters