2011-08-24 98 views
1

我发现存储过程中有几个要创建的存储过程,我希望存储过程接受SP的各种表中的ID列表应该对其进行操作。我正在考虑使用表值参数。我想知道的是,创建一个仅包含一个“ID int”列的单个Type并将其用作所有TVP的数据类型是一种好的做法,还是定义一个更好的做法是为每个SP键入类型,以防万一我将来希望扩展传递的值。创建一个用作表值参数的通用类型

有没有人有这方面的经验?

编辑如果它对您的建议有任何影响,我所传递的ID列表可能是150,000个条目。

回答

2

我可以以体验的方式为您提供的是,如果您发现需要更改用户定义表格类型的定义,则需要每引用该类型,然后才能使用该类型。在Cons section中提到那很麻烦。所以对于我们来说,值得代码维护来根据预期使用情况定义唯一的表类型,即使它与现有类型匹配。 YMMV

+1

+1这是困扰别名类型的相同问题(以前称为用户定义类型的类型,直到SQLCLR出现)。为了将类型“EmailAddress”从VARCHAR(255)更改为VARCHAR(320),您必须更改使用该类型的每个表。这种成本很快就超过了一致类型的好处,我们却取消了我们的统治者(以击败任何不同于标准的人)。 :-) –

+0

我相信在Sql Server中实施TVP需要你为它们定义一个自定义类型,所以使用TVP,完全避免自定义类型是不可能的。 –

+0

@Adam对,我的评论只是确认TVP(需要CREATE TYPE ... AS TABLE)受到类似于别名类型('CREATE TYPE ... FROM' - 以前的'sp_addtype')的限制。 –

1

为什么不使用内联表值函数来分割列表并返回表?如果您需要多次使用它,您可以只调用一次,并将结果填充到本地表变量中。对我来说,当你需要从客户端应用程序中获取复杂的数组到数据库时,TVP是最有益的 - 我不确定是否值得为包含ID的单个列添加麻烦。

+0

因此,您建议发送一个varchar参数,其中包含以逗号分隔(或其他结构化)格式的ID列表,然后使用内联函数解析它? 我还没有运行数字,但我的直觉是,它可以很好地适用于短列表,但大列表需要很长时间来解析。 –

+0

这取决于功能。我做了一些相当广泛的性能比较,而某些方法从图表上飞出,就像你建议其他方法保持相对静态甚至高达50,000个元素一样。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/07/07/splitting-a-list-of-integers-another-roundup.aspx –

相关问题