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

Откуда: Москва
Сообщений: 2549
relief
Glory
relief

т.е. Вы предлагаете как и Glory по каждому чеку заносить во временную таблицу в базе это значение?! Вы что?! Операция по сбору строки и селект будет на порядок быстрей работать чем постоянно в базу лазить! А если юзер почекал у ушел, что делать? Да и ресурсы тут задействуются СУБД

Что такое есть ваше "лазить в базу" ? Что такое "постянно лазить" ?
По-моему, вы просто не понимаете сути


Юзер выбрал гостя -> в базе данных вызывается процедура по добавлению записи во временную таблицу. Юзер отчекнул гостя -> в базе данных вызывается процедура по удалени записи из временной таблицы.
ну и сделайте так, чтобы по нажатию ОК все Ваши чеки заносились во времянку один раз
18 сен 09, 14:00    [7679017]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
relief
iap
relief
Glory
relief
хорошо. тогда так
declare @guests nvarchar(max)
set @guests = ';598|;11124|;1113|;1121|;1123|;'

select * from [pms].[dbo].[guests]
Where @Guests like '%;' + Convert(nvarchar, GuestID) + '|;%'

Т.е. какое-то приложение будет париться и собирать строку нужного формата вместо того, чтобы сразу эти значения записывать в серверную таблицу ?


наглядный пример:
есть таблица со списком гостей. Юзер чекает нужных ему гостей. Как Вы себе видите получение инфы из базы? Сейчас выделенные гости собираются в строку и передаются в процедуру. Может лучше вариант подскажите - буду признателен
Элементарно. Формируем скрипт вызова процедуры с предварительным заполнением временной таблицы выбранными значениями.
В процедуре эта временная таблица используется в JOINах с нужными таблицами.


т.е. Вы предлагаете как и Glory по каждому чеку заносить во временную таблицу в базе это значение?! Вы что?! Операция по сбору строки и селект будет на порядок быстрей работать чем постоянно в базу лазить! А если юзер почекал у ушел, что делать? Да и ресурсы тут задействуются СУБД
Нет, я имел в виду формирование текста вызова процедуры перед самым этим вызовом,
когда все "галочки" проставлены, проверены, убраны ненужные и т.д.
Просто в тексте перед вызовом стоит заполнение временной таблицы.
К примеру, я это делаю, пробегаясь по гриду (DevExpess), если речь идёт об обработке отобранных строк этого грида.
Тем более в 2008-м появилась новая очень удобная конструкция VALUES(),(),...
18 сен 09, 14:01    [7679024]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief,

и в чем проблема? но если уж очень не хочется - заполняйте таблицу при вызове запроса вместо сбора строки. Или если собираете строку по чекам - разберите на клиенте и загоните во временную таблицу. Или сделайте строку с полями фиксированной длины (т.е. под каждое число 10 символов, тогда ее на сервере будет легко разобрать.
18 сен 09, 14:04    [7679050]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Glory
relief

т.е. Вы предлагаете как и Glory по каждому чеку заносить во временную таблицу в базе это значение?! Вы что?! Операция по сбору строки и селект будет на порядок быстрей работать чем постоянно в базу лазить! А если юзер почекал у ушел, что делать? Да и ресурсы тут задействуются СУБД

Что такое есть ваше "лазить в базу" ? Что такое "постянно лазить" ?
По-моему, вы просто не понимаете сути


Юзер выбрал гостя -> в базе данных вызывается процедура по добавлению записи во временную таблицу. Юзер отчекнул гостя -> в базе данных вызывается процедура по удалени записи из временной таблицы.

Ваш юзер чекает со скоростью 1000 нажатий в секунду ? Или что вас беспкоит ?
И почему процедура ?


Беспокоит:
1. как отслеживать, что надо удалять (если юзер ушел)?
2. доп.ресурсы на СУБД
3. не уверен, что JOIN + запись во временную таблицу будет работать быстрей LIKE
4. В какие временные таблицы заносить данные: локальные или глобальные?

Процедура потому, что в системе нет прямых INSERT
18 сен 09, 14:09    [7679086]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
relief,

по п.п. 3 и 4 сейчас развернется дискуссия...
18 сен 09, 14:12    [7679107]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
Когда "чекать" не очень много, то на клиенте действительно можно собирать строку вида
String selected="1,2,3,4,5,6,7";
затем вызвать хранимку
ADOQuerySO->SQL->Text="exec dbo.SelectObjects "+QuotedStr(selected);
ADOQuerySO->Open();
а сама хранимка выглядит так:

CREATE PROCEDURE [dbo].[SelectObjects] 	
(
    @StrSelectedID   varchar(max)
)
AS
BEGIN

-----------------------------------------------
Declare @ExecSQL varchar(max)
set @ExecSQL='select * from ObjTable where id in ('+StrSelectedID+')'
exec(@ExecSQL)
-----------------------------------------------
END
ну и конечно, можно добавить проверку входящей строки на корректность данных и отсутствие угроз.
Я так в одной программулине уже делал .
Это была программа просмотра электронной почты , в ней нужно было что-то делать с выбранными письмами
18 сен 09, 14:15    [7679125]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
Беспокоит:
1. как отслеживать, что надо удалять (если юзер ушел)?
2. доп.ресурсы на СУБД
3. не уверен, что JOIN + запись во временную таблицу будет работать быстрей LIKE
4. В какие временные таблицы заносить данные: локальные или глобальные?

Процедура потому, что в системе нет прямых INSERT

1. Зачем что-то отслеживать ?
2. Т.е. ваша символьная строка будет меньшего размера, чем записи с полями int &
3. И что вы сделали, чтобы проверить свое "не уверен" ? Сравнили оба варианта ?
4. В какие хотите. Можео даже в постоянные
18 сен 09, 14:19    [7679155]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
relief
Беспокоит:
1. как отслеживать, что надо удалять (если юзер ушел)?
2. доп.ресурсы на СУБД
3. не уверен, что JOIN + запись во временную таблицу будет работать быстрей LIKE
4. В какие временные таблицы заносить данные: локальные или глобальные?
Забавный третий пункт.
По четвёртому пункту какой может быть спор? Зачем самому делать руками то, что сервер и так умеет, когда работает с локальными временными таблицами?
18 сен 09, 14:23    [7679188]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Беспокоит:
1. как отслеживать, что надо удалять (если юзер ушел)?
2. доп.ресурсы на СУБД
3. не уверен, что JOIN + запись во временную таблицу будет работать быстрей LIKE
4. В какие временные таблицы заносить данные: локальные или глобальные?

Процедура потому, что в системе нет прямых INSERT

1. Зачем что-то отслеживать ?
2. Т.е. ваша символьная строка будет меньшего размера, чем записи с полями int &
3. И что вы сделали, чтобы проверить свое "не уверен" ? Сравнили оба варианта ?
4. В какие хотите. Можео даже в постоянные


1. Начекал юзер 10 записей, записи занеслись во временную таблицу, а юзер ушел (сайт). Как ресурсы будем чистить?
2. Моя строка пришла и ушла из процедуры, а вот временные таблицы будут расти прямопропорционально кол-ву юзеров.
3. Пока не проверил, но на 99% уверен, что в моем случае расходы будут ниже
4. Как потом я буду видеть локальные временные таблицы в другой процедуре (поиска гостей)?
18 сен 09, 14:23    [7679192]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief

Беспокоит:
1. как отслеживать, что надо удалять (если юзер ушел)?
2. доп.ресурсы на СУБД
3. не уверен, что JOIN + запись во временную таблицу будет работать быстрей LIKE
4. В какие временные таблицы заносить данные: локальные или глобальные?

Процедура потому, что в системе нет прямых INSERT


хорошо, не хотите таблицу - сделайте строку с полями одинаковой ширина. Она разбирается на сервере простым селектом с substring.
По пункту 3 - у вас по GuestID индекс есть? Тогда JOIN будет однозначно быстрее LIKE, потому что для LIKE всегда будет полное сканирование.
18 сен 09, 14:23    [7679194]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief
Glory
relief
Беспокоит:
1. как отслеживать, что надо удалять (если юзер ушел)?
2. доп.ресурсы на СУБД
3. не уверен, что JOIN + запись во временную таблицу будет работать быстрей LIKE
4. В какие временные таблицы заносить данные: локальные или глобальные?

Процедура потому, что в системе нет прямых INSERT

1. Зачем что-то отслеживать ?
2. Т.е. ваша символьная строка будет меньшего размера, чем записи с полями int &
3. И что вы сделали, чтобы проверить свое "не уверен" ? Сравнили оба варианта ?
4. В какие хотите. Можео даже в постоянные


1. Начекал юзер 10 записей, записи занеслись во временную таблицу, а юзер ушел (сайт). Как ресурсы будем чистить?
2. Моя строка пришла и ушла из процедуры, а вот временные таблицы будут расти прямопропорционально кол-ву юзеров.
3. Пока не проверил, но на 99% уверен, что в моем случае расходы будут ниже
4. Как потом я буду видеть локальные временные таблицы в другой процедуре (поиска гостей)?

1. Временные таблицы вообще то удаляются при закрытии коннекта. Постоянные таблицы можно очищать джобом
3. Блажен, кто верует
4. Как напишите запрос, так и будете видеть
18 сен 09, 14:26    [7679216]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief

1. Начекал юзер 10 записей, записи занеслись во временную таблицу, а юзер ушел (сайт). Как ресурсы будем чистить?
2. Моя строка пришла и ушла из процедуры, а вот временные таблицы будут расти прямопропорционально кол-ву юзеров.
3. Пока не проверил, но на 99% уверен, что в моем случае расходы будут ниже
4. Как потом я буду видеть локальные временные таблицы в другой процедуре (поиска гостей)?


1. Если сессия разорвалась - временные таблицы удаляться автоматом.
2. Глупости вы говорите, временные таблицы создаются для сессии и удаляются вместе с ней. И временная таблица в 10 записей - копейки.
3. Блаженны верующие. Запустите свой вариант на таблице хотя бы в 10000 записей.
4. Временные таблицы видны в пределах сессии! Сколько уже можно одну и ту же чушь повторять?
18 сен 09, 14:27    [7679224]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
Убедили :)

Подскажите тогда решение в полном виде.

Заранее благодарен!
18 сен 09, 14:28    [7679240]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
relief,

вот
18 сен 09, 14:30    [7679250]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief
Убедили :)

Подскажите тогда решение в полном виде.

Заранее благодарен!


либо решение jap, либо делаете строку по 10 символов на число (хоть 0 добивайте, хоть пробелами), затем так:
declare @guests nvarchar(max)
set @guests = '      1234      1143'

select * from
[pms].[dbo].[guests] g join
(select cast(ltrim(substring(@guests, number*10 +1, 10)) as int) as id
 from master..spt_values
 where type = 'P' and number < datalength(@guests) /20
) t on g.GuestID = t.id

18 сен 09, 14:37    [7679303]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief,

единственное - вместо spt_values лучше использовать свою таблицу-счетчик, или через CTE делать.
18 сен 09, 14:38    [7679311]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
а что насчет where id in (1,2...) ???
18 сен 09, 15:38    [7679832]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
Влом регистрироваться
Guest
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t;

CREATE TABLE #t
(
	GuestID INT PRIMARY KEY
);

INSERT INTO #t
-- генерим SELECT... UNION вместо списка через запятую ---
SELECT 123 UNION
SELECT 345 UNION
SELECT 456 UNION
SELECT 678
-------------------------------------------------------------

EXEC spUseMyGuestsTempTable
18 сен 09, 16:29    [7680342]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
relief
iap
relief
Glory
relief
хорошо. тогда так
declare @guests nvarchar(max)
set @guests = ';598|;11124|;1113|;1121|;1123|;'

select * from [pms].[dbo].[guests]
Where @Guests like '%;' + Convert(nvarchar, GuestID) + '|;%'

Т.е. какое-то приложение будет париться и собирать строку нужного формата вместо того, чтобы сразу эти значения записывать в серверную таблицу ?


наглядный пример:
есть таблица со списком гостей. Юзер чекает нужных ему гостей. Как Вы себе видите получение инфы из базы? Сейчас выделенные гости собираются в строку и передаются в процедуру. Может лучше вариант подскажите - буду признателен
Элементарно. Формируем скрипт вызова процедуры с предварительным заполнением временной таблицы выбранными значениями.
В процедуре эта временная таблица используется в JOINах с нужными таблицами.


т.е. Вы предлагаете как и Glory по каждому чеку заносить во временную таблицу в базе это значение?! Вы что?! Операция по сбору строки и селект будет на порядок быстрей работать чем постоянно в базу лазить! А если юзер почекал у ушел, что делать? Да и ресурсы тут задействуются СУБД
Нет, я имел в виду формирование текста вызова процедуры перед самым этим вызовом,
когда все "галочки" проставлены, проверены, убраны ненужные и т.д.
Просто в тексте перед вызовом стоит заполнение временной таблицы.
К примеру, я это делаю, пробегаясь по гриду (DevExpess), если речь идёт об обработке отобранных строк этого грида.
Тем более в 2008-м появилась новая очень удобная конструкция VALUES(),(),...


а если 2005 сервер, то придется вызывать для каждого INSERT процедуру. Нет других вариантов создать таблицу int?
21 сен 09, 14:19    [7687167]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief,

во-первых - можно оформить вставку так, даже на 2005
insert into #NumTable
select 1143
union all select 1155
union all select 1113
и вызвать эту конструкцию один раз, хоть через процедуру, хоть как. Во-вторых - чем вам не нравится вариант с фиксированым числом символов под значение?
21 сен 09, 14:31    [7687265]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
iljy
relief,

во-первых - можно оформить вставку так, даже на 2005
insert into #NumTable
select 1143
union all select 1155
union all select 1113
и вызвать эту конструкцию один раз, хоть через процедуру, хоть как. Во-вторых - чем вам не нравится вариант с фиксированым числом символов под значение?


расскажите как в процедуру вы передаете массив int?
второй вариант пока не мерил на скорость. а вот вариант iap намного быстрей like
21 сен 09, 15:01    [7687548]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief,

а зачем в процедуру передавать массив int? можно сформировать insert и передать уже готовую команду на выполнение процедуре sp_executesql.
21 сен 09, 15:04    [7687581]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
iljy
relief,

а зачем в процедуру передавать массив int? можно сформировать insert и передать уже готовую команду на выполнение процедуре sp_executesql.


в проекте запрещены такие конструкции - только через процедуры
21 сен 09, 15:15    [7687663]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
iljy
Member

Откуда:
Сообщений: 8711
relief,

? а что, sp_executesql - не процедура? Или обязательно должна быть пользовательская? Так сделайте такую:
create proc ExecSql @sql nvarchar(max)
as
  exec sp_executesql @sql
21 сен 09, 15:25    [7687734]     Ответить | Цитировать Сообщить модератору
 Re: Select по массиву int в виде nvarchar  [new]
relief
Member

Откуда:
Сообщений: 1197
iljy
relief,

? а что, sp_executesql - не процедура? Или обязательно должна быть пользовательская? Так сделайте такую:
create proc ExecSql @sql nvarchar(max)
as
  exec sp_executesql @sql


в системе запрещены любые виды t-sql (select, insert и т.п.) - это только в базе. Обращение идет только по пользовательским процедурам
21 сен 09, 16:34    [7688158]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить