【问题标题】:Call MS SQL Server Stored Procedure with multiple parameters inclusive of table-value parameter使用多个参数(包括表值参数)调用 MS SQL Server 存储过程
【发布时间】: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


【解决方案1】:

这为我编译和运行:

create type TT as table (ID int not null);
go
create procedure P1
    @Val1 int,
    @Val2 TT readonly,
    @Val3 int
as
    select @Val1 as Val1,ID,@Val3
    from @Val2;
go
create procedure P2
as
    declare @T TT;
    insert into @T(ID) values (1),(2)

    exec P1 10,@T,13
go
exec P2

结果:

Val1        ID          
----------- ----------- -----------
10          1           13
10          2           13

所以,我不知道您的问题是什么,但它无法混合表格和非表格参数。

【讨论】:

  • 感谢 Damien,感谢您的回复,但请娱乐我并默认参数。这是我在您的答案中看到的唯一区别(除了 table-value 参数的位置 - 但我认为这不是问题)。我不知道这是否需要考虑,但我更改了存储过程,然后添加了 table-value 参数。
  • @Amd4632 - 是的,如果非表参数具有默认值,则可以正常工作。我写了原版并在大约 5 分钟内试用了它。我将其更新为默认设置,并在大约 2 分钟内再次运行它。这些不是复杂或昂贵的测试 - 如果您没有临时服务器(运行 Express 或 Developer Edition),我强烈推荐它。
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多