【问题标题】:Can Table value parameters (TVP) be created inside and used in a single stored procedure?表值参数(TVP)可以在内部创建并在单个存储过程中使用吗?
【发布时间】:2016-01-29 17:09:58
【问题描述】:

我有一个存储过程需要在一个存储过程中接受多个值。在寻找执行此操作的方法后,似乎在 SQL Server 2008+ 中建议使用表值参数 (TVP)。我正在使用 SQL Server 2014。

我想知道的是,是否可以在同一个存储过程中创建和使用 TVP,或者是否需要在使用它们的存储过程之外创建 TVP?如果可能的话,我希望能够将所有内容包含在一个存储过程中,这样我就可以从代码中调用这样的东西。

exec spMyProcedure "bob, Sam, Phil, Carol"

理想情况下,我想在实体框架播种中通过 Code First 部署脚本。

【问题讨论】:

  • 您需要在外部创建 TVP 并使用它来将多个值传递给程序。如果您在 proc 内部创建,那么您将失去使用 TVP 的目标
  • 如果您只是尝试将一维字符串数组传递给过程,除了使用 TVP 之外,还有其他一些不太复杂的选项。
  • @JamieD77 - 哪些方法最适合您?您是否在存储过程中解析字符串?
  • @webworm 传入一个分隔字符串并使用像sqlperformance.com/2012/07/t-sql-queries/split-strings 之一这样的拆分函数或使用 xml 数据类型
  • @JamieD77 - 很棒的链接!谢谢。我喜欢它如何分解您可以选择的所有选项。

标签: sql-server stored-procedures parameters


【解决方案1】:

表值参数只是作为参数传递的表值变量。

所以是的——您可以在您的 SP 中声明一个表值变量,并以与使用表值参数相同的方式使用它。

就像您可以将字符串作为参数传递或将字符串声明为变量一样,您也可以对表变量执行相同的操作。

但是

你的例子没有意义。在这里,您将字符串传递给存储过程。如果该过程将把该字符串变成一个表格,您应该改为传递一个 TVP。这就是说它们被“推荐”的全部意义。建议使用它们而不是传递字符串。

【讨论】:

  • 如何通过 C# 代码传递 TVP?存储过程将通过 ADO.NET 调用。
  • 很好 -- 给你...将你的问题传递给谷歌的第一个结果:msdn.microsoft.com/en-us/library/bb675163.aspx
  • 我的问题是,包含您想要传递给存储过程的值的表是否需要已经在 SQL Server 中定义,而不是动态定义。下次尝试少一点态度。
  • @webworm - 那我想我不明白你的问题,因为这对我来说没有意义。如果您将表作为参数传递,那么为什么要在其他地方定义它。我不明白。
  • @webworm 是的,该参数通常在 proc 参数中定义为 @tvp as dbo.TableValueParameter,因此 dbo.TableValueParameter 必须首先存在于您的数据库中。这是您创建的类型,如 CREATE TYPE TableValueParameter AS TABLE (id Int); msdn.microsoft.com/en-us/library/bb510489(SQL.100).aspx
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2021-12-26
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2016-12-17
相关资源
最近更新 更多