在最终向用户呈现结果集之前,我对表变量做了很多工作.例如,我可能从许多不同的表中拉入一大堆列,如下所示:
DECLARE @tmp TABLE
(
ID int,
username nvarchar(50), -- data taken from tbl_Users
site nvarchar(50), -- data taken from tbl_Sites
region nvarchar(100), -- data taken from tbl_Regions
currency nvarchar(5) -- data taken from tbl_Currencies
)
Run Code Online (Sandbox Code Playgroud)
我花了很多时间浏览对象资源管理器以确保列的数据长度正确(与原始表匹配).有时,如果我更改表模式但不更新所有过程,我可能会遇到截断错误.
采取懒惰的做法是否有任何问题:
DECLARE @tmp TABLE
(
ID int,
username nvarchar(max),
site nvarchar(max),
region nvarchar(max),
currency nvarchar(max)
)
Run Code Online (Sandbox Code Playgroud)
nvarchar(max)实际上是否会消耗更多内存或根据数据大小分配内存?还有其他陷阱吗?
请注意,我知道跳转到定义的第三方工具,但这不是我要求的.
UPDATE
重复的问题有价值,但问题不一样恕我直言.副本围绕实际表的设计而不是表变量.但是,答案中有一些优点,即:
从这个意义上讲,似乎可以nvarchar(max)在表变量中使用而不是nvarchar(n),但在某些环境中它具有可靠性和性能风险.如果你认为这应该被删除然后公平(但请停止争论我欣赏所有输入!)
可能重复:
总是使用nvarchar(MAX)有什么缺点吗?
通过选择'ntext'作为列类型而不是包含字符但具有有限的最大大小(如'char'或'varchar')的类型,是否存在一般性缺点?
我不确定有限的列大小是否适用于我的所有列.因此,我会对包含文本的所有列使用'ntext'.这可能导致将来出现问题吗?
(我在ASP.net Webforms应用程序中使用Linq-To-SQL)
我有一个数据库,其中有很多字符串列.我应该使用NVARCHAR(MAX)还是将字符串限制为合理的最大值,例如NVARCHAR(100)等?我真正想知道的是,如果我将列设置为NVARCHAR(MAX)并且该列的所有值都是100个字符或更少,那么我可以通过将该列设置为NVARCHAR(100)来节省空间吗?
我知道spac不是这里唯一的问题,数据的"验证"也很重要,但我只是在询问空间问题.