Return NVARCHAR 或 VARCHAR 变量定义的长度

Return length of NVARCHAR or VARCHAR variable definition

我在存储过程中声明了一个变量:

DECLARE @CurrentChunk NVARCHAR(250)

我想使用变量的长度,即 250,稍后在我的 sp 中用于计算目的,我想尽可能保持我的代码为 dry

这是我的代码(假设 @Narrative 是 SP 的参数):

DECLARE @ChunkSizeCharacters INT, 
        @NumChunks INT, 
        @LoopIndex INT, 
        @CurrentChunk NVARCHAR(250)

SET @ChunkSizeCharacters = 250 -- HERE'S WHERE I WANT THE LENGTH OF @CurrentChunk
SET @NumChunks = CEILING((LEN(@Narrative) * 1.0)/@ChunkSizeCharacters)
SET @LoopIndex = 0;

WHILE (@LoopIndex < @NumChunks)
    BEGIN
        SET @CurrentChunk = SUBSTRING(@Narrative, 
            ((@LoopIndex * @ChunkSizeCharacters) + 1), @ChunkSizeCharacters)

        INSERT INTO [dbo].[Chunks] ([Chunk]) VALUES (@CurrentChunk)
        SET @LoopIndex = @LoopIndex + 1
    END

有没有办法确定NVARCHARVARCHAR变量的长度定义(请仔细阅读——我不是在寻找LEN())?

如果您不介意覆盖变量(如果您这样做,您可以将其分配给一个临时变量 NVARCHAR(MAX)):

SELECT @CurrentChunk = REPLICATE(0, 8000);
SELECT @ChunkSizeCharacters = LEN(@CurrentChunk);

这个技巧对 NVARCHAR(MAX) 没有也不能奏效,但这应该没问题,因为它的最大尺寸非常大。

不幸的是,T-SQL 没有任何变量的元数据属性。甚至确定表达式的类型也是一件苦差事。

MaxLength 变体 属性 returns 似乎是您要查找的值。

 DECLARE @Banana varchar(255) = 'This banana'

 SELECT SQL_VARIANT_PROPERTY(@Banana, 'MaxLength')

Returns255.

有趣的是,SELECT SQL_VARIANT_PROPERTY 语句返回的值不会 select 到一个普通的预定义变量中。最后,我使用了:

DECLARE @Text VARCHAR(400), @TextLen INT
SELECT @TextLen = CAST(SQL_VARIANT_PROPERTY(ISNULL(@Text, ''), 'MaxLength') AS INT)

对我来说就像一个魅力!