- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在最终向用户呈现结果集之前,我对表变量进行了大量工作。例如,我可能会从许多不同的表中提取全部列,如下所示:
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
)
我花了很多时间浏览对象资源管理器以确保列的数据长度正确(与原始表匹配)。有时,如果我更改表架构但不更新所有过程,我可能会遇到截断错误。
采取懒惰的方法并这样做是否有任何问题:
DECLARE @tmp TABLE
(
ID int,
username nvarchar(max),
site nvarchar(max),
region nvarchar(max),
currency nvarchar(max)
)
nvarchar(max)
实际上会使用更多内存还是根据数据大小分配的内存?还有其他问题吗?
请注意,我知道可以使用第三方工具跳转到定义,但这不是我要问的。
更新
重复的问题有值(value),但恕我直言,问题并不相同。副本围绕实际表的设计,而不是表变量。然而,答案有一些优点,即:
从这个意义上说,在表变量中使用 nvarchar(max)
代替 nvarchar(n)
似乎没问题,但它具有可靠性和某些环境中的性能风险。如果您认为应该删除此内容,那么很公平(但请停止争论,我感谢所有意见!)
最佳答案
我想不出有任何理由在表变量中使用 nvarchar(max) 会有任何与在表( the downsides of which are explained in this question )中使用 nvarchar(max) 不同的陷阱,除了由于首先,表变量和临时/永久表之间的差异(例如糟糕的统计数据、没有二级索引等)。 Martin Smith draws a great comparison between table variables and temp tables here .
您仍然需要担心某些问题,例如,如果您使用经典的 ASP/ADO 等古老技术,您可能会发现必须最后列出 MAX 列才能确保结果准确。 I explained this here back in 2000, before MAX types were introduced ;但他们在那些旧的提供程序中存在与 TEXT
/NTEXT
相同的问题。您不太可能使用该技术,但我想我会提到它以防万一。
不过,我建议您在编写代码时接受并编写正确的类型。它们很容易从元数据中派生(例如 sys.columns
或右键单击表并说出脚本 > 创建到 > 剪贴板),这样做可以防止出现任何问题(例如 the one @JC. mentioned above 有关长度不匹配,可能导致溢出/截断)。
此外,正如我之前暗示的那样,如果您有大量行(感谢@Stuart),您应该考虑使用 #temp 表。我仍然认为,无论你选择什么,都应该有明确的定义。在这种情况下,使用 MAX 处理所有事情的唯一好处是,它可以让您变得懒惰,同时让您面临很大的风险。您编写代码一次,但您的用户运行它无数次。多花几分钟来使数据类型正确,即使这意味着如果架构发生更改,您必须在稍后更正两次。
至于nvarchar(max)
的内存使用情况,是的,这可能会改变您的性能。 See this blog post for some evidence 。部分相关片段,以及我的拼写/语法更正:
So if you are sure that the length of your nvarchar column will be less than 8000, then do not define the column as nvarchar(max) but rather define it as nvarchar(fixedlength) wherever possible. The main advantages I see for using fixed length are:
Memory grant could be a big issue where the server is already memory starved. As expected row size is more the optimizer will estimate more memory grant and this value will be much higher than actually required and this would be a waste of a resource as precious as memory. If you have couple of queries which are using nvarchar(max) column and sorting is needed then server might have memory related issues. This could be a big perf issue.
他列出的其他优点与索引有关。无论如何,这不是表变量的问题,因为您无法创建二级索引(在 SQL Server 2014 之前)。
但是,无论您从哪种类型的表结构中提取数据(临时表、表变量、永久表等),这个潜在的问题实际上都没有什么不同。
关于sql-server - 表变量列中的 nvarchar(max) 与 nvarchar(n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141598/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!