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

时间:2015-02-24 16:05:40

标签: sql-server sql-server-2008 sql-server-2008-r2

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

DECLARE @CurrentChunk NVARCHAR(250)

我想在我的sp中稍后使用变量的长度,即250用于计算目的,并且我希望尽可能将代码保留为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变量定义的长度(请仔细阅读 - 我没有找{{1} }})?

3 个答案:

答案 0 :(得分:4)

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

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

 SELECT SQL_VARIANT_PROPERTY(@Banana, 'MaxLength')

返回255。

答案 1 :(得分:2)

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

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

这个技巧不适用于NVARCHAR(MAX),也不适用于{{1}},但考虑到它的巨大最大尺寸,这大概没有问题。

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

答案 2 :(得分:0)

有趣的是,该SELECT SQL_VARIANT_PROPERTY语句返回的值未选择到普通的预定义变量中。最后,我使用了:

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

对我来说就像是一种魅力!