Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Как средствами T-SQL организовать считывание информации из xml-файла частями
28 апр 04, 17:27    [655351]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
OPENXML
28 апр 04, 17:29    [655360]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Если openxml, то какое ж это считывание из файла? :-)
Это скорее считыване из переменой (sp_xml_preparedocument @h OUTPUT, Xmltext)
28 апр 04, 17:40    [655400]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
Я вам уже в который раз говорю, что в TSQL нет функций для работы с внешними файлами на низком уровне.
Содержимое файла SQLServer-у должно передавать какое-то клиентское приложение.
28 апр 04, 17:48    [655425]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Граждане, ситуация такая, очень нужно средствами T-sql организовать вставку данных из xml-файла в таблицу (xml-файлы могут быть очень большими). Есть много намёток по этой теме, но не получается как то собрать всё и довести до ума. Очень рассчитываю на Вашу помощь!
28 апр 04, 17:50    [655434]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Есть такие наработки:

Create Procedure dbo.xxx
@XMLtxt ntext
AS
DECLARE @h int
EXEC sp_xml_preparedocument @h OUTPUT, @XMLtxt
-- Inserting using OPENXML
INSERT INTO Oils
SELECT *
FROM OPENXML(@h, '/Root/Oils', 1)
WITH Oils

EXEC sp_xml_removedocument @h
GO
******************************************************

CREATE TABLE #tmpFileLines (pr_info ntext)

-- Insert lines from files into temp table (using xp_cmdshell)
INSERT #tmpFileLines EXEC master.dbo.xp_cmdshell 'TYPE c:\mysql.xml'

***********************************************
DECLARE @datalen int,

@sql varchar(8000),

@sql1 varchar(8000),

@cnt int



SELECT @datalen = DATALENGTH (pr_info) / 8000 + 1 FROM #tmpFileLines

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(8000)'

SET @cnt = @cnt + 1

END

SET @sql = @sql + ',' + CHAR( 13) + '@textptr varbinary(16)' + CHAR(13) +

'SELECT @textptr = TEXTPTR(pr_info) FROM #tmpFileLines'


SET @cnt = 1

WHILE (@cnt <= @datalen)

BEGIN

IF LEN(@SQL) < 7900

SELECT @SQL = @SQL + CHAR (13) + 'SELECT @str' + CONVERT

(varchar(10), @cnt) + ' = SUBSTRING (pr_info, ' + CONVERT (varchar(30),

(@cnt-1) * 8000 + 1) + ', 8000) FROM #tmpFileLines'

ELSE

SELECT @SQL1 = @SQL1 + CHAR (13) + 'SELECT @str' + CONVERT

(varchar(10), @cnt) + ' = SUBSTRING (pr_info, ' + CONVERT (varchar(30),

(@cnt-1) * 8000 + 1) + ', 8000) FROM #tmpFileLines '

SET @cnt = @cnt + 1

END



SELECT @SQL1 = @SQL1 + CHAR(13) + 'EXEC (''EXEC dbo.xxx @XMLtext = '''''' + '

SET @cnt = 1

WHILE (@cnt <= @datalen)

BEGIN

SELECT @SQL1 = @SQL1 + CASE @cnt WHEN 1 THEN '' ELSE ' + ' END + '@str'+CONVERT(varchar(10),@cnt)

SET @cnt = @cnt + 1

END



SET @SQL1 = @SQL1 + '+'''''''')'

Print @SQL

PRINT @SQL1

PRINT '**************************************===========>>>>>>>>>>>>>>>>>>>'

SET @cnt = 1

WHILE (@cnt <= @datalen)

BEGIN

SELECT @SQL1 = @SQL1 + CHAR (13) + 'PRINT @str' + CONVERT (varchar(10), @cnt)

SET @cnt = @cnt + 1

END

exec (@SQL+@SQL1)

DROP TABLE #tmpFileLines

Но это дело не работает:

(50 row(s) affected)
DECLARE @str1 varchar(8000),
@textptr varbinary(16)
SELECT @textptr = TEXTPTR(pr_info) FROM #tmpFileLines
SELECT @str1 = SUBSTRING (pr_info, 1, 8000) FROM #tmpFileLines

EXEC ('EXEC dbo.xxx @XMLtext = ''' + @str1+'''')
**************************************===========>>>>>>>>>>>>>>>>>>>
Server: Msg 212, Level 16, State 1, Line 1
Expression result length exceeds the maximum. 8000 max, 16000 found.

Как сделать этот скрипт рабочим?
28 апр 04, 18:02    [655470]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Люди,ау!
28 апр 04, 18:06    [655494]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
Складывается такое впечатление что вы просто не читаете ответы которые вам адресуются. Либо у вас переиодически провалы в памяти возникают

https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=87963&hl=#639096
28 апр 04, 18:09    [655505]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Молодой человек, я всегда все ответы читаю и провалов в памяти у меня не бывает, а Ваш ответ из прошлого топика я просто не понял(не разобрал код), а также не понял почему вы так со мной говорите и разве я Вам давал повод со мной так разговаривать?
28 апр 04, 18:28    [655557]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
разве я Вам давал повод со мной так разговаривать?
Потому что вы один и тот же вопрос задаете уже 5-ый раз
28 апр 04, 18:37    [655577]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
:))
Guest
как вы топик назовете, так оно и поплывет :))
28 апр 04, 18:44    [655595]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
так кто-нить подскажет как сделать этот скрипт рабочим?
28 апр 04, 19:15    [655641]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Люди!
28 апр 04, 19:22    [655651]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
CREATE TABLE #tmpFileLines (pr_info ntext)
DECLARE @str1 varchar(8000)
28 апр 04, 19:35    [655674]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Я прошу прощения, но что делать с этой ошибкой?

CREATE TABLE #tmpFileLines (pr_info ntext)

-- Insert lines from files into temp table (using xp_cmdshell)
--INSERT #tmpFileLines EXEC master.dbo.xp_cmdshell 'TYPE c:\mysql.xml'

DECLARE @str1 varchar(8000),
@textptr varbinary(16)
SELECT @textptr = TEXTPTR(pr_info) FROM #tmpFileLines
SELECT @str1 = SUBSTRING (pr_info, 1, 8000) FROM #tmpFileLines

EXEC ('EXEC dbo.xxx @XMLtext = ''' + @str1+'''')

Server: Msg 212, Level 16, State 1, Line 6
Expression result length exceeds the maximum. 8000 max, 16000 found.
28 апр 04, 21:23    [655775]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
Unicode символ занимает 2 байта в отличии от не-Unicode символа.
Поэтому SELECT SUBSTRING (pr_info, 1, 8000) FROM #tmpFileLines из столбца ntext извлекает 8000 Unicode символов т.е. 16000 байтов. А объявленная вами переменная @str1 может вместить только 8000 байтов. вот об этом и говориться в сообщении "Expression result length exceeds the maximum. 8000 max, 16000 found."
28 апр 04, 21:30    [655782]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Понятно.
А не подскажете что бы это значило?

CREATE TABLE #tmpFileLines (pr_info ntext)

-- Insert lines from files into temp table (using xp_cmdshell)
--INSERT #tmpFileLines EXEC master.dbo.xp_cmdshell 'TYPE c:\mysql.xml'

DECLARE @str1 varchar(8000),
@textptr varbinary(16)
SELECT @textptr = TEXTPTR(pr_info) FROM #tmpFileLines
SELECT @str1 = SUBSTRING (pr_info, 1, 4000) FROM #tmpFileLines

EXEC ('EXEC dbo.xxx @XMLtext = ''' + @str1+'''')

Server: Msg 8145, Level 16, State 2, Procedure xxx, Line 0
@XMLtext is not a parameter for procedure xxx.
28 апр 04, 21:43    [655791]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Уважаемый Glory подскажите как победить эту ошибку.
29 апр 04, 09:47    [656168]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Уважаемые форумяне!
Есть процедура

Create Procedure dbo.xxx
@XMLtxt ntext
AS
DECLARE @h int
EXEC sp_xml_preparedocument @h OUTPUT, @XMLtxt
-- Inserting using OPENXML
INSERT INTO Oils
SELECT *
FROM OPENXML(@h, '/Root/Oils', 1)
WITH Oils
EXEC sp_xml_removedocument @h
GO
и кодCREATE TABLE #tmpFileLines (pr_info ntext)

-- Insert lines from files into temp table (using xp_cmdshell)
--INSERT #tmpFileLines EXEC master.dbo.xp_cmdshell 'TYPE c:\mysql.xml'

DECLARE @str1 varchar(8000),
@textptr varbinary(16)
SELECT @textptr = TEXTPTR(pr_info) FROM #tmpFileLines
SELECT @str1 = SUBSTRING (pr_info, 1, 4000) FROM #tmpFileLines

EXEC ('EXEC dbo.xxx @XMLtext = ''' + @str1+'''')

Server: Msg 8145, Level 16, State 2, Procedure xxx, Line 0
@XMLtext is not a parameter for procedure xxx.

Подсажите что это за ошибка и как с ней бороться. Зараннее благодарен.
29 апр 04, 10:07    [656226]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Glory
Member

Откуда:
Сообщений: 104760
Господи, как же можно ТАК писать программы ??

Create Procedure dbo.xxx
@XMLtxt ntext

EXEC ('EXEC dbo.xxx @XMLtext = ''' + @str1+'''')

Найдите 3 отличия
29 апр 04, 10:13    [656247]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Если честно, я не понял, что Вы имели ввиду
29 апр 04, 10:26    [656288]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
zz
Member

Откуда: Колыбель космонавтики
Сообщений: 1796
У вас переменные по-разному обзываются.
29 апр 04, 10:28    [656294]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Вот я болван!!!!!!!! Это просто ужас, вчера весь вечер просидел, не мог понять в чём дело!!!!!
Спасибо большое всем за содействие (в частности нервному Glory)
29 апр 04, 10:30    [656300]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
Кобзев
Member

Откуда:
Сообщений: 78
Хотя я его (Glory) понимаю :-)
29 апр 04, 10:32    [656306]     Ответить | Цитировать Сообщить модератору
 Re: Как  [new]
:))
Guest
@XMLtxt <> @XMLtext

бедный глЙорик :))
29 апр 04, 10:32    [656307]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить