2010-09-15 61 views
6

我有一个存储过程,它需要一个由管道分隔的ID数组的字符串并将其解析出来。我希望在事务中发生这种情况,所以不要一次将它们传递给一个事务。使用varchar(max)作为存储过程参数是个好主意吗?

如果我使用varchar(max)作为不限制传入参数的大小,这会导致问题吗?我没有看到被限制的命中,但我也不想猜测或对字符串进行任意限制。

CREATE PROCEDURE myProc 
    @IDs varchar(max) 
AS 

BEGIN 
    ... 
END 
GO 

回答

3

没有太多。 varchar(max)的行为与任何小于8000个字符的varchar相同,直到超过8000个字符。如果实际数据少于8000个字符,则在varchar(200)varchar(max)之间应该几乎没有差别。如果你期望的是较小的输入,但不能排除更大的输入,varchar(max)非常棒。

2

我不知道这是否会造成问题,但我更喜欢用什么量多元素“阵列”,以XML存储过程来传递。它使它更清楚它是什么类型的数据,并且有很好的SQL-XML工具可以将XML“转换”为可以加入的伪表。然后,从管道分隔 - > XML转换可能发生在数据库之外。

+0

如果它是值的简单列表(未多值)XML增添了不少额外的数据(所有的标签)传输。 – 2010-09-15 20:58:12

+0

我已经看到了有关使用XML出于这样的目的的其他建议,但我会补充说,使用'VARCHAR(MAX)'绝对不会造成问题和-的自在。还有是“任意”限制(根据SQL Server联机丛书[为SQL Server 2005] 2147483647个字符),但它是作为@KM说“几乎无限的”。 – 2010-09-15 20:59:45

+0

是的,我对使用XML的单个值列表留有遗憾。 – Kenoyer130 2010-09-15 21:07:48

0

我使用varchar(max)时,我不知道限制(那是什么它的存在)。总是好的,具有一定的长度设置的变量,但如果不清楚这是可以接受的,并不会造成任何问题,除非你的数据库不断增长的有点大,人能够欺骗在

1

如果大数据量你在SQL Server 2008上,那么我会使用一个表值参数。如果不是,我总是喜欢尽可能使用最小的尺寸,但我不明白MAX为什么会导致存储过程参数出现问题。如果你希望这个参数的长度几乎不受MAX的限制。

-1

TSQL不是一个好的字符串操作语言,并且在性能方面(和代码明智的!),你最好在解析字符串之外的字符串 - 因此+1到n8wrl's answer。本质上,使用varchar(max)这没什么错。

除了使用了XML像n8wrl建议,一个Table Valued Parameter可能是一个不错的选择,如果你使用SQL Server 2008的

+0

我想包装在一个事务的处理,这样就意味着我不想分析它的DB之外。 – Kenoyer130 2010-09-15 21:09:03

相关问题