2016-05-29 82 views
5

我有一个相对简单的网站,它使用php + mssql。我有各种存储过程,可以简单地插入和删除工作。我面临的问题是,我传入存储过程的许多参数与插入数据的列的长度相同。sql server存储过程使用varchar max作为参数

例如我有一个存储过程来注册一个用户。存储的过程有一个参数@USERNAMEvarchar(12)作为类型。 USER表中的列与该长度具有相同的类型。原则上这不是一个真正的问题。但我宁愿能够自由地更改列长度,而不必更改存储过程参数的长度。

由于mssql php驱动程序不支持它们,我无法使用表值参数。

我可以想象的唯一解决方案就是使用varchar(max)作为存储过程参数,但这被认为是不好的做法?

+1

在我看来,存储过程参数应该反映底层的列类型。这将避免运行时截断错误并提供一个自我记录存储过程接口。 –

+0

恕我直言,不要这样限制字段长度。磁盘空间很便宜,而且SQL Server速度很快,而且最重要的是......事情变化 –

+1

要么使用参数sql资源IMO更适合版本控制,要么为数据库中的每个字段创建UDT。那么你只需要改变那里的定义来影响表和存储过程 – Mark

回答

0

简答:是的。

如果有人传入长度为2,147,483,647个字符的用户名,这将意味着什么?!通过使用varchar(max),你暗示它可以。

我同意@DanGuzman的评论。表格列的大小应该首先确定,然后参数和变量的大小应相应调整。如果你必须改变表格列的大小,那么你必须在其他地方传播这种变化 - 这是最佳实践方法。

适当调整表格列并不总是那么容易 - 用户名应该多长时间? 12对我来说似乎很短,2,147,483,647肯定太长 - 介于两者之间? ;)@JohnCappelletti也有一个有效的点 - 存储和处理相对于更改的成本来说便宜,所以在确定大小时偏大。

如果varchar(max)不好,并且你不想遵循最佳实践,是否有中间立场?也许使用10的因子?一些足够高于实际大小的东西,但不是过分的。

另一件需要注意的事项,无论您如何调整参数,都是无提示截断或运行时截断错误 - 明确检查长度。