我在存储过程中声明了一个变量:
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
有没有办法确定NVARCHAR
或VARCHAR
变量定义的长度(请仔细阅读 - 我没有找{{1} }})?
答案 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)
对我来说就像是一种魅力!