我有一个存储过程,它需要一个由管道分隔的ID数组的字符串并将其解析出来。我希望在事务中发生这种情况,所以不要一次将它们传递给一个事务。使用varchar(max)作为存储过程参数是个好主意吗?
如果我使用varchar(max)作为不限制传入参数的大小,这会导致问题吗?我没有看到被限制的命中,但我也不想猜测或对字符串进行任意限制。
CREATE PROCEDURE myProc
@IDs varchar(max)
AS
BEGIN
...
END
GO
我有一个存储过程,它需要一个由管道分隔的ID数组的字符串并将其解析出来。我希望在事务中发生这种情况,所以不要一次将它们传递给一个事务。使用varchar(max)作为存储过程参数是个好主意吗?
如果我使用varchar(max)作为不限制传入参数的大小,这会导致问题吗?我没有看到被限制的命中,但我也不想猜测或对字符串进行任意限制。
CREATE PROCEDURE myProc
@IDs varchar(max)
AS
BEGIN
...
END
GO
没有太多。 varchar(max)
的行为与任何小于8000个字符的varchar相同,直到超过8000个字符。如果实际数据少于8000个字符,则在varchar(200)
和varchar(max)
之间应该几乎没有差别。如果你期望的是较小的输入,但不能排除更大的输入,varchar(max)
非常棒。
我不知道这是否会造成问题,但我更喜欢用什么量多元素“阵列”,以XML存储过程来传递。它使它更清楚它是什么类型的数据,并且有很好的SQL-XML工具可以将XML“转换”为可以加入的伪表。然后,从管道分隔 - > XML转换可能发生在数据库之外。
我使用varchar(max)时,我不知道限制(那是什么它的存在)。总是好的,具有一定的长度设置的变量,但如果不清楚这是可以接受的,并不会造成任何问题,除非你的数据库不断增长的有点大,人能够欺骗在
如果大数据量你在SQL Server 2008上,那么我会使用一个表值参数。如果不是,我总是喜欢尽可能使用最小的尺寸,但我不明白MAX为什么会导致存储过程参数出现问题。如果你希望这个参数的长度几乎不受MAX的限制。
TSQL不是一个好的字符串操作语言,并且在性能方面(和代码明智的!),你最好在解析字符串之外的字符串 - 因此+1到n8wrl's answer。本质上,使用varchar(max)
这没什么错。
除了使用了XML像n8wrl建议,一个Table Valued Parameter可能是一个不错的选择,如果你使用SQL Server 2008的
我想包装在一个事务的处理,这样就意味着我不想分析它的DB之外。 – Kenoyer130 2010-09-15 21:09:03
如果它是值的简单列表(未多值)XML增添了不少额外的数据(所有的标签)传输。 – 2010-09-15 20:58:12
我已经看到了有关使用XML出于这样的目的的其他建议,但我会补充说,使用'VARCHAR(MAX)'绝对不会造成问题和-的自在。还有是“任意”限制(根据SQL Server联机丛书[为SQL Server 2005] 2147483647个字符),但它是作为@KM说“几乎无限的”。 – 2010-09-15 20:59:45
是的,我对使用XML的单个值列表留有遗憾。 – Kenoyer130 2010-09-15 21:07:48