Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Можно ли написать функцию, способную выводить строку длиной более 4096 символов, или хотябы заставить ее разбить на несколько строк результирующей таблицы?
17 окт 03, 19:55    [382088]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
По размеру:

char and varchar
Fixed-length (char) or variable-length (varchar) character data types.

char[(n)]

Fixed-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000. Storage size is n bytes. The SQL-92 synonym for char is character.

varchar[(n)]

Variable-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000. Storage size is the actual length in bytes of the data entered, not n bytes. The data entered can be 0 characters in length. The SQL-92 synonyms for varchar are char varying or character varying.

По функции:

Inline Table-valued Functions

CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS TABLE

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

RETURN [ ( ] select-stmt [ ) ]

Multi-statement Table-valued Functions

CREATE FUNCTION [ owner_name. ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )

RETURNS @return_variable TABLE < table_type_definition >

[ WITH < function_option > [ [,] ...n ] ]

[ AS ]

BEGIN
function_body
RETURN
END

< function_option > ::=
{ ENCRYPTION | SCHEMABINDING }

< table_type_definition > :: =
( { column_definition | table_constraint } [ ,...n ] )
17 окт 03, 20:26    [382117]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Да, это конечно всё хорошо..... ну а больше..... 8000? :)
17 окт 03, 20:32    [382125]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31598
Как можно вывести строку больше 8000, если такой строки не бывает???
Или уж уточните, что нужно сделать-то...
17 окт 03, 20:37    [382137]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Ну ладно функция такая:

CREATE FUNCTION dbo.getPageInfo3 (@pageId INT)  

RETURNS VARCHAR(4096) AS
BEGIN
DECLARE @id VARCHAR(5)
DECLARE @url VARCHAR(256)
DECLARE @header VARCHAR(256)
DECLARE @strXML VARCHAR(4096)

SET @strXML='<mi '

SELECT @id=[id],
@url=[url],
@header=REPLACE([header],'"','&quot;')
FROM page WHERE id=@pageId

SET @strXML=@strXML+'u="'+@url+'" h="'+@header+'">'

DECLARE cur CURSOR FOR
SELECT [id] FROM page WHERE [parent]=@pageId AND @pageId<>212 ORDER BY [title]

OPEN cur

FETCH NEXT FROM cur INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
SET @strXML=@strXML+dbo.getPageInfo3(@Id)
FETCH NEXT FROM cur INTO @id
END

CLOSE cur

SET @strXML=@strXML+'</mi>'

RETURN @strXML
END


Как видите пришлось заменить
SET @strXML=@strXML+'url="'+@url+'" header="'+@header+'">'
на
SET @strXML=@strXML+'u="'+@url+'" h="'+@header+'">'

...впринципе это спасло.....но не на долго....стоит увеличить глубину дерева....ииииииии.......

....получаем оборваную строку....с которой ни чо не остается сделать как выкинуть!!!!

Тип TEXT для локальных переменных использовать запрещено...

Так как быть????
17 окт 03, 20:38    [382138]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
если хотите можно
VARCHAR(4096)
заменить на
VARCHAR(8000)

...но проблемы это не решает!!!
17 окт 03, 20:40    [382144]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
...или может быть кто-то знает как вывести дерево с помощью запроса FOR XML EXPLIXIT? :)
17 окт 03, 20:54    [382158]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Как обычно получается разговор с самим собой... :))

У меня тут идея возникла.... в качестве параметра рекурсивной функции передавать таблицу и добавлять в нее по одной строке... а уж потом на клиенте восстановить можно!

Как думаете прокатит? ... ладно завтра попробую......
17 окт 03, 21:07    [382167]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
Crimean
Member

Откуда:
Сообщений: 13148
syscomments именно так и реализована.
"Все придумано до нас" (ц) :)
18 окт 03, 13:48    [382434]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Что в этом определении не правльно?

CREATE FUNCTION dbo.getPageInfo4 (@pageId INT, @tmp TABLE(strXML VARCHAR(8000)))  
18 окт 03, 15:00    [382464]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
Glory
Member

Откуда:
Сообщений: 104760
Что в этом определении не правльно?

Переменные типа table не могут использоваться в качестве входных параметров.
Только в функции и только в качестве возвращаемого параметра.

...или может быть кто-то знает как вывести дерево с помощью запроса FOR XML EXPLIXIT?
Задавался такой вопрос уже. Проще сделать это на клиенте.
18 окт 03, 15:08    [382468]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Ну а просто в фунции можно таблицу определить типа:
CREATE FUNCTION dbo.getPageInfo4 (@pageId INT)  

RETURNS TABLE AS
BEGIN
DECLARE @tmp TABLE(strXML VARCHAR(8000))
18 окт 03, 15:26    [382477]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
Glory
Member

Откуда:
Сообщений: 104760
CREATE FUNCTION dbo.fn_Number2Range  (@range_type smallint=0)  

RETURNS @RangeTable TABLE (RangeID smallint identity, Low_Value decimal(10,2), High_value decimal(10,2)) AS
BEGIN
INSERT @RangeTable(Low_Value, High_value) VALUES(0.00, 49.99)
INSERT @RangeTable(Low_Value, High_value) VALUES(50.00, 99.99)
RETURN
END
18 окт 03, 15:44    [382494]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Функция getPageInfo4 возвращает таблицу, а в качестве параметра передается INT...

Можно ли без создания курсора создать запросы, которые аналогичны данным,
но РАБОЧИЕ! :)

SELECT strXML FROM getPageInfo4(SELECT [id] FROM pages WHERE [id] IS NULL)


SELECT strXML FROM getPageInfo4(pages.[id]),pages WHERE pages.[id] IS NULL)
18 окт 03, 16:04    [382507]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
И еще сразу вопросик: есть ли разница если объявлять VARCHAR(8000) или VARCHAR(1000), но использовать только 100 байт?
18 окт 03, 16:10    [382511]     Ответить | Цитировать Сообщить модератору
 Re: Строка длинной больше 4096.....  [new]
shurman
Member

Откуда: Тула
Сообщений: 153
Ну вощем получилось что-то типа этого:

CREATE FUNCTION dbo.getSiteMap2()

RETURNS @tmp TABLE(strXML VARCHAR(8000)) AS
BEGIN
DECLARE @id INT

DECLARE cur CURSOR FOR
SELECT [id] FROM page WHERE [parent] IS NULL AND [type]<100

OPEN cur

FETCH NEXT FROM cur INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @tmp(strXML) SELECT strXML FROM dbo.getPageInfo4(@Id)
FETCH NEXT FROM cur INTO @id
END

CLOSE cur

RETURN
END


REATE FUNCTION dbo.getPageInfo4 (@pageId INT)
RETURNS @tmp TABLE(strXML VARCHAR(8000)) AS
BEGIN
DECLARE @id VARCHAR(5)
DECLARE @url VARCHAR(256)
DECLARE @header VARCHAR(256)
DECLARE @strXML VARCHAR(4096)

SELECT @id=[id],
@url=[url],
@header=REPLACE([header],'"','&quot;')
FROM page WHERE id=@pageId

INSERT INTO @tmp(strXML) VALUES ('<mi u="'+@url+'" h="'+@header+'">')

DECLARE cur CURSOR FOR
SELECT [id] FROM page WHERE [parent]=@pageId AND type<100 ORDER BY [title]

OPEN cur

FETCH NEXT FROM cur INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @tmp(strXML) SELECT * FROM dbo.getPageInfo4(@Id)
FETCH NEXT FROM cur INTO @id
END

CLOSE cur

INSERT INTO @tmp(strXML) VALUES ('</mi>')

RETURN
END


Если кто-нибудь что по интереснее придумает делитесь..... будем ждать!
18 окт 03, 16:32    [382519]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить