Reply to Re: data length more than ...

Your name:

Reply:


Posted by AJA on 03/28/07 13:30

>> Hello
>> I have problem with reading from XML when XML is to large.
>> Program delare 1-n variables where is declaration but can no make more
>> delarations than length 8000 :((
>
> If this is SQL 2005, try varchar(max)

Sorry i forgot tell its MSSQL 2k :(( any other idea?

AJA


>
>
>>
>> drop table tblBooksEx
>> CREATE TABLE [tblBooksEx] (
>> [Row_ID] [int] IDENTITY (1, 1) NOT NULL ,
>> [BooksData] [text] COLLATE Polish_CI_AS NULL ,
>> CONSTRAINT [PK__tblBooksEx__17036CC0] PRIMARY KEY CLUSTERED
>> (
>> [Row_ID]
>> ) ON [PRIMARY]
>> ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
>> GO
>> insert into tblBooksEx(booksdata) values('')
>> exec master..xp_cmdshell 'TextCopy.exe /S serv /U usr /Ppsv /D Northwind
>> /T
>> tblBooksEx /C BooksData /F c:\SCN.xml /W "WHERE Row_ID=1" /I'
>>
>>
>> /*PART 1*/
>> DECLARE @id int
>> DECLARE @idoc int
>> SET @id = 1 -- or whatever the id
>>
>> DECLARE @datalen int
>> DECLARE @sql varchar(8000)
>> DECLARE @sql1 varchar(8000)
>> DECLARE @cnt int
>> -- get the length
>> SELECT @datalen = DATALENGTH (booksdata) / 4000 + 1 FROM tblBooksEx WHERE
>> row_id = @id
>>
>> -- phase 1 collect into @sql declarations of @str1, @str2,...@strn
>> SET @cnt = 1
>> SET @sql='DECLARE '
>> SET @sql1 = ''
>> WHILE (@cnt <= @datalen)
>> BEGIN
>> SELECT
>> @sql = @sql + CASE @cnt
>> WHEN 1 THEN ''
>> ELSE ', ' + CHAR(13)
>> END
>> + ' @str'+CONVERT(varchar(10),@cnt)+' VARCHAR(4000)'
>> SET @cnt = @cnt + 1
>> END
>> -- phase 2 collect into @sql selection of chunks (takng care of length)
>> SET @cnt = 1
>> WHILE (@cnt <= @datalen)
>> BEGIN
>> IF LEN(@sql) < 7850
>> SELECT @sql = @sql + CHAR (13) +
>> 'SELECT @str' + CONVERT(VARCHAR(10), @cnt) + ' =
>> REPLACE(SUBSTRING(booksdata, ' +
>> CONVERT(VARCHAR(30), (@cnt-1)*4000+1) + ', 4000),CHAR(39),
>> CHAR(39)+CHAR(39) ) ' +
>> 'FROM tblBooksEx ' +
>> 'WHERE row_id = ''' + cast(@id as varchar) + ''''
>> ELSE
>> SELECT @sql1 = @sql1 + CHAR (13) +
>> 'SELECT @str' + CONVERT(VARCHAR(10), @cnt) + ' =
>> REPLACE(SUBSTRING(booksdata, ' +
>> CONVERT(VARCHAR(30), (@cnt-1)*4000+1) + ', 4000),CHAR(39),
>> CHAR(39)+CHAR(39) ) ' +
>> 'FROM tblBooksEx ' +
>> 'WHERE row_id = ''' + cast(@id as varchar) + ''''
>> SET @cnt = @cnt + 1
>> END
>>
>>
>> /*PART 2*/
>> -- phase 3 preparing the 2nd level dynamic sql
>> SELECT @sql1 = @sql1 + CHAR(13) + 'EXEC ('+ CHAR(13) + '''DECLARE @idoc
>> int'+ CHAR(13) +
>> 'EXEC sp_xml_preparedocument @idoc OUT, '''''' + '
>> SET @cnt = 1
>> WHILE (@cnt <= @datalen)
>> BEGIN
>> SELECT @sql1 = @sql1 + CHAR (13) + '@str' + CONVERT (varchar(10), @cnt) +
>> '
>> +'
>> SET @cnt = @cnt + 1
>> END
>> SET @sql1 = @sql1 + ' '''''' '
>> SET @sql1 = @sql1 + CHAR(13) + 'DECLARE idoc_cur CURSOR FOR SELECT
>> @idoc'''
>> +CHAR(13) + ')'
>> --debug code
>> /*
>> PRINT @sql
>> PRINT '@sql length=' +convert(varchar(5),datalength(@sql))
>> PRINT '----------'
>> PRINT @sql1
>> PRINT '@sql1 length=' +convert(varchar(5),datalength(@sql1))
>> */
>> EXEC (@sql + @sql1)
>> OPEN idoc_cur
>> FETCH NEXT FROM idoc_cur into @idoc
>> DEALLOCATE idoc_cur
>>
>>
>>
>>
>> select * from OpenXML(@idoc, '//transfer/body', 2) WITH (ng int, nk int,
>> dw
>> nvarchar(50))
>> --When Complete
>> --/*
>> exec sp_xml_removedocument @idoc
>> --*/
>>
>> How to solve this problem??
>>
>>
>> Best Regards
>> AJA
>>
>
> --
> Greg Moore
> SQL Server DBA Consulting Remote and Onsite available!
> Email: sql (at) greenms.com
> http://www.greenms.com/sqlserver.html
>
>

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация