Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Есть таблица с 1 полем (uid) типа varChar(30). Ситуация такова, на входе процедуры список строковых значений разделенных запятой (в конкретном случае 100 значений). Каким образом запихнуть эти значения в поле uid при помощи одного запроса INSERT (а не сотни разумеется ). Кто что может сказать по этому поводу, это вообще возможно? Если бы данные извлекались из другой таблицы, то это выглядело бы так: INSERT INTO TestTable1 (uid) SELECT uid FROM TestTable2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 09:22 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Если так уж нужно, чтобы команда INSERT только один раз присутсвовала в коде, то можно записать получаемую строку в текстовый файл (возможно с добавлением/заменой символов для разделения полей/записей) и использовать затем BULK INSERT. Будет ли это быстрее и не возникнут ли какие-нибудь побочные вопросы - кто знает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 09:33 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Этот вариант я уже обдумывал, боюсь что использование промежуточных файлов нежелательно и скорее всего невозможно (в моем случае). Но все равно спасибо. Может еще есть варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 09:39 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Ведь кто-то формирует список строковых значений? Так пусть вместо этого формирует таблицу-переменную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 09:52 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Список значений формируется в COM объекте, который при помощи ADO соединяется с базой и вызывает процедуру со списком значений в качестве параметра. А что такое таблица - переменная? Можно ли сформировать ее в программе, т.е. через MS SQL API. Разъясните плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 09:58 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Сорри зачем сто инсертов, можно и один но в цикле )) Можно таким макаром влить в промежуточную таблицу а оттуда одним инсертом в основнкую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 10:32 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
А в чем смысл вливания данных в промежуточную таблицу, чтобы скучно не было? Мне просто надо максимально ускорить процесс добавления этих записей. Ну а насчет цикла это ты загнул )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 10:50 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
1 строка - 1 INSERT. 100 строк - 100 INSERT. (Если я правильно понял - надо добавить 100 строк) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 10:59 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
В 2000 можно написать ф-цию: CREATE FUNCTION StrToArray (@StrValue varchar(8000), @Delimiter varchar(10)) RETURNS @Array TABLE (ID int, IntValue int) AS BEGIN DECLARE @StartLoc int, @EndLoc int, @Len int, @Val varchar(20), @ValNum int IF LEN(@Delimiter) = 0 RETURN SELECT @StartLoc = 1, @EndLoc = 1, @Len = LEN(@StrValue), @ValNum = 1 WHILE @Len > 0 BEGIN SELECT @EndLoc = CHARINDEX(@Delimiter, @StrValue, @StartLoc) IF @EndLoc = 0 SELECT @EndLoc = @Len + 1, @Len = 0 SELECT @Val = LTRIM(SUBSTRING(@StrValue, @StartLoc, @EndLoc - @StartLoc)) IF @Val <> '' BEGIN INSERT @Array (ID, IntValue) SELECT @ValNum, CAST(@Val as int) END SELECT @StartLoc = @EndLoc + LEN(@Delimiter), @ValNum = @ValNum + 1 END RETURN END GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 11:01 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Давайте-ка все таки определимся 1. Вы получаете данные для добавления в таком виде, что не можете сразу их добавить в таблицу 2. Для разбора полученной строки придется использовать цикл (т.к. вариант с промежуточным текстовым файлом и BULK INSERT вам не подходит) 3. Раз цикл - значит на каждом шаге цикла нужно вставлять новую запись 4. Использование временной промежуточной таблицы может быть оправдано, т.к. в многопользовательской базе данных обновляемая основная таблица может быть к примеру заблокирована другим пользователем и соответсвенно ваша команда INSERT будет. Временная же таблица видна только вам и никем кроме вас блокироваться не будет. Т.е. теоритически 100 INSERT-ов в основную таблицу могут выполняться медленне, чем 100 INSERT-ов во временную таблицу и 1 INSERT в основную таблицу. 5. К тому же непонятно, должен ли передаваемый вам параметер добавляться как все 100 записей или можно будет добавить только 99, на 100-ой произойдет ошибка. Если получаемые данные должны добавляться целиком или не добавляться вообще, то придется применять транзакции. А держать открытую транзакцию в цикле из 100 шагов - это не есть хорошо. Поправьте меня, если я где-то не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 11:12 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
To Alisa: После твоего ответа мне стало казаться что я в зазеркалье )) To Glory: 0. Спасибо за желание помочь. 1. Вернее не бывает. 2. Тоже правильно. 3. Собственно это так сказать вариант по умолчанию не вставлять же в самом деле 100 строк INSERT ))), но хотелось решить это более красиво. 4. В принципе как я понял из документации, накладные расходы на создание таблицы-переменной тоже большие. И если при многократных INSERT сервер производит буферизацию, то прирост в производительности может быть очень маленьким. Блокировка в данном случае не играет роли, т.к. все запросы в базу выполняются с NOLOCK. 5.Полученные данные должны быть добавлены целиком, без какого либо анализа. Собственно сама таблица используется как вспомогательная и обрабатывается в те промежутки времени, когда сервер наименее загружен. Т.е. формулировка того что собственно меня интересует - как можно быстрее запихнуть в таблицу 100 значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 12:03 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Насчет цикла шутка А вот насчет временной таблицы кроме преимуществ указанных Glory можешь получить + плюс по скорости при наличии в осноной таблице индексов. Да и появляется возможность обработки промежуточных данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 12:39 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Навеяно SergSuper-ом Create table table1 (string varchar(10)) Create table table2 (Number int) insert into table2 values(1) insert into table2 values(11) insert into table2 values(21) insert into table2 values(31) insert into table2 values(41) insert into table2 values(51) insert into table2 values(61) insert into table2 values(71) insert into table2 values(81) insert into table2 values(91) declare @v varchar(100) set @v='1111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000' insert into table1 select substring(@v, Number, 10) from table2 select * from Table1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 13:18 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Забыл дописать, понятное дело позиции должны быть фиксированы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 13:21 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Ну вот, самое интересное пропустил... Тем не менее >Список значений формируется в COM объекте, который при помощи ADO соединяется с базой и вызывает процедуру со списком значений в качестве параметра. А что такое таблица - переменная? Можно ли сформировать ее в программе, т.е. через MS SQL API. Разъясните плиз. Что такое таблица - переменная Вы наверное уже разобрались. Но это только в 2K. А в остальном это аналог временной таблицы, но В ПАМЯТИ. Так что накладные расходы по ее созданию куда меньше, чем по созданию #Table (последняя в любом случае физическая структура на диске). Обьявляется @Table как переменная, так что с API проблем никаких. Ворпос в другом - что важнее - быстро сформировать данные для вставки или быстро их вставить? Естно COM самостоятельно во много раз быстрее соберет строку, чем создаст @table на сервере и запихает туда данные. Уточните. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2001, 16:13 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Ок, спасибо всем кто принял участие в обсуждении этой проблемы. В особенности Павлу и Glory. Итак в варианте для SQL2k я остановился на варианте фомирования таблицы-переменной (в теле процедуры) + UDF "List2Array", код приведен ниже. -------- List2Array ------- CREATE FUNCTION List2Array (@StrValue varchar(4096), @Delimiter varchar(10) = ',') RETURNS @Array TABLE (uid uniqueidentifier) AS BEGIN DECLARE @StartLoc int, @EndLoc int IF LEN(@StrValue) > 0 BEGIN SET @StartLoc = 1 WHILE @EndLoc <> 0 BEGIN SET @EndLoc = CHARINDEX(@Delimiter, @StrValue, @StartLoc) IF @EndLoc <> 0 INSERT INTO @Array (UID) VALUES (CAST(LTRIM(RTRIM(SUBSTRING(@StrValue, @StartLoc, @EndLoc - @StartLoc))) As uniqueidentifier)) SET @StartLoc = @EndLoc + LEN(@Delimiter) END END RETURN END --------------------------- А в 7-м пришлось идти банальным путем, т.е. просто запихнуть значения в цикле. Посему есть еще одна причина перейти на 2000 Реализация чего нибудь в самом COM обьекте не оправдана, т.к. он написан на Visual Basic и накладные расходы при вызовах SQL API будут несоизмеримо больше. Ежели кто еще может что-то добавить - милости просим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2001, 09:02 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
Для MSSQL2000 более проще и универсальнее все это можно через sp_xml_preparedocument и FROM OPENXML ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2001, 15:36 |
|
||
|
Добавление нескольких значений при помощи одного INSERT'a.
|
|||
|---|---|---|---|
|
#18+
А вот так: insert into t (YourColumn) select @Var01 union all select @Var02 union all select @Var03 Ну и так далее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2001, 16:40 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32011511&tid=1825824]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 262ms |
| total: | 471ms |

| 0 / 0 |
