返回NVARCHAR或VARCHAR变量定义的长度

问题描述 投票:2回答:3

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

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())?

sql-server sql-server-2008 sql-server-2008-r2
3个回答
4
投票

似乎MaxLength变量属性返回您正在寻找的值。

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

 SELECT SQL_VARIANT_PROPERTY(@Banana, 'MaxLength')

返回255。


2
投票

如果你不介意覆盖变量(如果你这样做,你可以将它分配给temp NVARCHAR(MAX)):

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

这个技巧不适用于NVARCHAR(MAX),也不适用,但考虑到巨大的最大尺寸,这可能没什么问题。

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


0
投票

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

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

对我来说就像一个魅力!

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