如果我在 NVARCHAR(max) 列上调用 Left([col], x),将输出保存在 NVARCHAR(x) 列中是否始终安全?

问题描述 投票:0回答:1

认为

NVARCHAR(x)
的论点是字符数的常见误解今天已经多次困扰着我。我问这个问题是为了进一步探讨这个话题。

考虑一个

NVARCHAR(max)
列。从表
FOO_PERM_COL
中将其称为
FOO_PERM_TABLE
。下面的代码会失败吗?

CREATE TABLE #FOO_TEMP_TABLE
(
   FOO_TEMP_COL NVARCHAR(1000) NOT NULL
)

INSERT INTO #FOO_TEMP_TABLE
SELECT Left(FOO_PERM_COL, 1000)
FROM FOO_PERM_TABLE

如果代码可能失败,我希望看到一些导致其失败的示例。如果整理很重要,请这么说。如果代码不会失败,那么我希望参考文档来支持支持这一点的论点。

sql sql-server string t-sql nvarchar
1个回答
-2
投票

在这种特定情况下,您提供的代码不应由于 NVARCHAR 大小而失败。原因是,当您将数据插入临时表中的 NVARCHAR 列时,它将使用与原始表中的源列相同的数据类型定义。在本例中,您将

FOO_TEMP_COL
定义为 NVARCHAR(1000),并且从
FOO_PERM_COL
FOO_PERM_TABLE
列中选择数据,即 NVARCHAR(max)。

在 SQL Server 中,当您执行此类插入时,目标列(临时表中的

FOO_TEMP_COL
)将自动调整大小以容纳源列(永久表中的
FOO_PERM_COL
)中的数据。 NVARCHAR(max) 最多可容纳 2^31-1 (2,147,483,647) 个字符,因此可以轻松放入 NVARCHAR(1000) 列。

这里的关键点是 SQL Server 会为您处理此问题,并且您无需担心此特定场景中的截断。 SQL Server 将自动调整临时表中目标列的大小,以适应永久表中源列的数据。

但是,需要注意的是,如果您尝试将数据从较大的列插入较小的列(例如,NVARCHAR(1000) 到 NVARCHAR(255)),那么您可能会遇到截断问题,并且数据将被截断以适应较小的色谱柱尺寸。在您的情况下,目标列大小等于或大于源列,您不应该遇到任何数据截断问题。

© www.soinside.com 2019 - 2024. All rights reserved.