1

我有一个关于 Transcat SQL 的问题,下面是 sql 代码;

DECLARE @main nVARCHAR(max);

--there are over 4000 characters to @main 
set @main = '01234567890123456789...';
Print len(@main)

@main 的长度是正确的,例如 4007 但是,如果我将代码更改为以下:

DECLARE @main nVARCHAR(max);

--there are over 4000 characters to @main 
set @main = N'01234567890123456789...';
Print len(@main)

@main 的长度总是 4000,这很奇怪,我不明白。另一件事是,如果我将代码更改为以下内容:

DECLARE @main nVARCHAR(max), @split nVARCHAR(500);

--there are 500 characters to @split 
set @split = '01234567890123456789...';
set @main = @split + @split + @split + @split + @split + @split + @split + @split + @split + @split;
Print len(@main)

@main 的长度是 4000,为什么?无论我在'01234567890123456789...'之前添加字母N吗?如果我将@split 更改为 varchar(500) DECLARE @main nVARCHAR(max), @split VARCHAR(500);

--there are 500 characters to @split 
set @split = '01234567890123456789...';
-- 10 @split
set @main = @split + @split + @split + @split + @split + @split + @split + @split + @split + @split;
Print len(@main)

@main 的长度是正确的,不管我在 ''01234567890123456789...' 前加字母 N 与否,@main 的长度总是 5000

4

1 回答 1

1

您遇到了隐式类型的字符串表达式的问题。除了MAX长度,一个VARCHAR类型可以容纳 8000 个字符(受 SQL SERVER 中页面大小的限制),并且由于NVARCHAR存储双字节字符,它可以容纳一半的字符数(4000)。默认情况下,字符串表达式(文字、连接字符串等)使用最大长度 8000 forvarchar或最大长度4000for进行评估nvarchar。您必须将表达式显式转换为MAX类型才能获得您期望的行为。

在您的第一个示例中,您的字符串表达式'01234567890123456789...'被隐式评估为 aVARCHAR(8000)然后隐式转换为,NVARCHAR(MAX)因此它正确保留了字符数,因为您的表达式只有 4007 个字符。

当您将字符串表达式转换为 unicode 时(即,它像在将值分配给变量之前N'01234567890123456789...'一样评估字符串。NVARCHAR(4000)NVARCHAR(MAX)

将您的第二个示例更改为:

DECLARE @main nVARCHAR(max);

--there are over 4000 characters to @main 
set @main = CAST(N'01234567890123456789...' AS NVARCHAR(MAX));
Print len(@main)

它会按照您的预期运行。

同样,当您连接@split变量时,SQL Server 正在评估表达式,因为NVARCHAR(4000)您必须转换最左边的值NVARCHAR(MAX)才能使表达式评估为NVARCHAR(MAX)

DECLARE @main nVARCHAR(max), @split nVARCHAR(500);

--there are 500 characters to @split 
set @split = '01234567890123456789...';
set @main = CAST(@split as NVARCHAR(MAX)) + @split + @split + @split + @split + @split + @split + @split + @split + @split;
Print len(@main)

它会起作用的。

于 2011-11-14T05:12:46.383 回答