Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 результаты функций LEN() и DATALENGTH() в строках длиной > 8000  [new]
Лев Толстой
Guest
Имеется Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.0.

Исследую работу некоторых функций на длинных строках.
Делаю вот это:
SELECT S,L_TRUE=1000*LEN(S),DL_TRUE=1000*DATALENGTH(S),SV_LEN=LEN(SV),SV_DATALEN=DATALENGTH(SV),SN_LEN=LEN(SN),SN_DATALEN=DATALENGTH(SN)
FROM
(
	SELECT S,SV=CAST(REPLICATE(S,1000) AS VARCHAR(MAX)),SN=CAST(REPLICATE(S,1000) AS NVARCHAR(MAX))
	FROM
        (
		SELECT S='1'
		UNION ALL SELECT '12'
		UNION ALL SELECT '123'
		UNION ALL SELECT '1234'
		UNION ALL SELECT '12345'
		UNION ALL SELECT '123456'
		UNION ALL SELECT '1234567'
		UNION ALL SELECT '12345678'
		UNION ALL SELECT '123456789'
		UNION ALL SELECT '1234567890'
		UNION ALL SELECT '12345678901'
		UNION ALL SELECT '123456789012'
		UNION ALL SELECT '1234567890123'
		UNION ALL SELECT '12345678901234'
		UNION ALL SELECT '123456789012345'
		UNION ALL SELECT '1234567890123456'
		UNION ALL SELECT '12345678901234567'
		UNION ALL SELECT '123456789012345678'
		UNION ALL SELECT '1234567890123456789'
		UNION ALL SELECT '12345678901234567890'
	)T0
)T1

Получаю интересный результат:
SL_TRUEDL_TRUESV_LENSV_DATALENSN_LENSN_DATALEN
1100010001000100010002000
12200020002000200020004000
123300030003000300030006000
1234400040004000400040008000
123455000500050005000500010000
1234566000600060006000600012000
12345677000700070007000700014000
123456788000800080008000800016000
1234567899000900079927992799215984
1234567890100001000080008000800016000
12345678901110001100079977997799715994
123456789012120001200079927992799215984
1234567890123130001300079957995799515990
12345678901234140001400079947994799415988
123456789012345150001500079957995799515990
1234567890123456160001600080008000800016000
12345678901234567170001700079907990799015980
123456789012345678180001800079927992799215984
1234567890123456789190001900079997999799915998
12345678901234567890200002000080008000800016000


Терзает вопрос: почему в некоторых строках длиной > 8000 результаты функций LEN() и DATALENGTH() не равны тому, что в полях L_TRUE и DL_TRUE соотв-но ?
17 ноя 09, 23:42    [7942443]     Ответить | Цитировать Сообщить модератору
 Re: результаты функций LEN() и DATALENGTH() в строках длиной > 8000  [new]
Лев Толстой
Guest
Ooops. Кажется, невнимательно читал BOL про replicate()
BOL
If string_expression is not of type varchar(max) or nvarchar(max), REPLICATE truncates the return value at 8,000 bytes. To return values greater than 8,000 bytes, string_expression must be explicitly cast to the appropriate large-value data type.


В общем, ответ нашёл. Всем спасибо.
17 ноя 09, 23:50    [7942452]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить