powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подайте идейку по фильтрации
12 сообщений из 12, страница 1 из 1
Подайте идейку по фильтрации
    #32049722
Dushic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть табличка с полем IDWord
Надо отфильтровать записи, используя в качестве фильтра массив IDWord'ов.
Массив может быть до 100 000 элементов, т.е. WHERE IDWord = 1 OR IDWord = 2 ... не пойдет.

Или подскажите, как бысро вставить эти IDWord во временную табличку. Простой INSERT каждой записи отрабатывает за 10 минут - не катит...
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049732
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select idWord into #temptable
from WordTable
where IDWord in (массив твоих idword или select из другой таблицы)
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049733
Dushic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во, насчет "массив твоих idword" поподробнее пожалуйста :))

У меня это пока массив в сишнике long IDWord[100000];
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049735
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делай через так:

insert into #tmp select 1 union select 2 ... union select N1
insert into #tmp select N1+1 union select N1+2 ... union select N2
....

Так в разы можно ускорить.

Можно массив в файл слить и потом BCP или DTS на него натравить. Так еще быстрее будет.
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049737
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, я не до конца понял задачу. Во-первых, мой запрос выглядеть должен по-другому:

select * into #temptable
from WordTable
where IDWord in (массив)

Как ты этот массив передаешь в запрос? Формируешь сначала текст, потом запихиваешь в SQL запрос, и потом скопом выполняешь?
Если так, то ты при формировании текста запроса напиши цикл, который будет формировать строку из твоего массива (через запятую) и потом эту текстовую строку добавь на место массива в запрос.
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049744
Dushic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Как ты этот массив передаешь в запрос?
Так это я, собственно, и хочу выянить - как передать массив в запрос :)

Но идею ты мне дал - попробую сформировать строчку. Интересно только, какой максимальной длинны может быть запрос, поскольку при внесении 100 000 записей длина запроса будет в районе полутонны. Выдержит ли SQL-автомат :))
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049764
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй... Я применял подобный механизм, когда условие Where в запросе зависит от каких-то дополнительных навороченных условий (case, как правило, в этих случаях не выручает).
Длина запроса - не знаю, но должен выдержать... Разве что компонента c++ может не принять...
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049781
Dushic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил на 5 тысячах. Отработало за несколько секунд. Пойдет, сенькс.
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049784
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На здоровье... Был рад помочь...
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049842
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лови
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE  FUNCTION SPLIT (
	@string varchar( 8000 ),
	@delimeter varchar( 1 ) = ',')
RETURNS @ret TABLE (id int PRIMARY KEY)
AS
BEGIN
	DECLARE @s int, @e int

	SET @s =  0 
	WHILE CHARINDEX(@delimeter,@string,@s) <>  0 
	BEGIN
		SET @e = CHARINDEX(@delimeter,@string,@s)
		INSERT @ret VALUES (CONVERT(int,SUBSTRING(@string,@s,@e - @s)))
		SET @s = @e +  1 
	END
	INSERT @ret VALUES (CONVERT(int,SUBSTRING(@string,@s, 8000 )))
	RETURN
END
...
INSERT #ids 
SELECT * FROM [dbo].[SPLIT](@ids,',')
...
DELETE t
WHERE EXISTS (SELECT  1  FROM #ids i WHERE i.id = t.id)
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049883
Salik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Как ты этот массив передаешь в запрос?
...
Рейтинг: 0 / 0
Подайте идейку по фильтрации
    #32049932
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если посмотреть внимательно - строкой.
На бейсюке Join(arr,",") , на сях уже не помню :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подайте идейку по фильтрации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]