sql server存储过程使用varchar max作为参数

Joh*_*ith 6 php sql-server varchar stored-procedures

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

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

我不能使用表值参数,因为mssql php驱动程序不支持它们.

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

Rhy*_*nes 1

简短回答:是的。

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

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

然而,正确调整表列的大小并不总是那么容易——用户名应该有多长?12 对我来说似乎很短,2,147,483,647 绝对太长 - 介于两者之间?;) @JohnCappelletti 也有一个有效的观点 - 与更改成本相比,存储和处理成本较低,因此在调整大小时要犯大的错误。

如果 varchar(max) 不好,并且您不想遵循最佳实践,是否有中间立场?也许使用因子 10?比实际尺寸足够大但又不过分。

无论您如何调整参数大小,要注意的另一件事是静默截断或运行时截断错误 - 显式检查长度。