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

Откуда:
Сообщений: 738
DECLARE @var1 varchar(200), @var2 varchar(200), @date_from datetime, @date_to datetime
SQL Server 2005

В базе имеется порядка 300 таблиц
Имя таблиц имеет формат "T_Table_2013_01_01_00_00_00" ... и так до "T_Table_2013_11_21_00_00_00"
и мне подсказали как по циклу пройти по всем таблицам и сделать выборку:

DECLARE @tmp1 varchar(200), @tmp2 varchar(200), @tmp3 varchar(500)
SET @date_from = CAST('2013-01-01' AS datetime)
SET @date_to = CAST('2013-11-21' AS datetime)

WHILE @date_from < @date_to
  BEGIN
    set @tmp1 = CONVERT(CHAR(10),@date_from,120)
    set @tmp2 = REPLACE(@tmp1, '-', '_')
    set @tmp3 = 'Select * from T_Table_' + @tmp2 + '_00_00_00 where [Pole1]= 123'
    EXEC(@tmp3)
    SET @date_from = DATEADD(day, 1, @date_from)
 END


но в другой БД формат таблиц немного другой
для каждого для еще семь подтаблиц с разбиением на часы
"T_Table_2013_01_01_03_00_00"
"T_Table_2013_01_01_07_00_00"
"T_Table_2013_01_01_11_00_00"
"T_Table_2013_01_01_15_00_00"
"T_Table_2013_01_01_19_00_00"
"T_Table_2013_01_01_23_00_00"
...
"T_Table_2013_11_21_03_00_00"
"T_Table_2013_11_21_07_00_00"
"T_Table_2013_11_21_11_00_00"
"T_Table_2013_11_21_15_00_00"
"T_Table_2013_11_21_19_00_00"
"T_Table_2013_11_21_23_00_00"

как мне сделать массив из 7-ми элементов, которыми будут строковыми переменными 03, 07, 11, 15, 19, 23 и по ним проходить и добавлять в запрос?

DECLARE @tmp1 varchar(200), @tmp2 varchar(200), @tmp3 varchar(500)

SET @date_from = CAST('2013-01-01' AS datetime)
SET @date_to = CAST('2013-11-21' AS datetime)

Declare My_cursor cursor local  FOR 
--как тут поместить в курсор 6 записей 03, 07, 11, 15, 19, 23  не загоняя их в таблицу и не делая от туда Select * From TempTable
 
WHILE @date_from < @date_to
  BEGIN
  set @tmp1 = CONVERT(CHAR(10),@date_from,120)
  set @tmp2 = REPLACE(@tmp1, '-', '_')
  Open My_cursor
   Fetch next from My_cursor into @var2
     WHILE @@Fetch_STATUS=0
      BEGIN 
         set @tmp3 = 'Select * from T_Table_' + @tmp2 + '_' + @var2 + '_00_00 where [Pole1]= 123'
         EXEC(@tmp3)
         Fetch next from My_cursor into @var2
     END
    Close My_cursor
    Deallocate My_cursor  
  SET @date_from = DATEADD(day, 1, @date_from)
END
21 ноя 13, 22:10    [15170863]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
мне сделать массив из 7-ми элементов, которыми будут строковыми переменными 03, 07, 11, 15, 19, 23 и по ним проходить и добавлять в запрос?

какай нафиг массив ?
Вы не умеете прибавлять к переменной 4 ?
Или не можете присвоить переменной начальное значение 3 ?
21 ноя 13, 22:16    [15170876]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
Glory
Ольга Семенова
мне сделать массив из 7-ми элементов, которыми будут строковыми переменными 03, 07, 11, 15, 19, 23 и по ним проходить и добавлять в запрос?

какай нафиг массив ?
Вы не умеете прибавлять к переменной 4 ?
Или не можете присвоить переменной начальное значение 3 ?


ну а как это сделать? чтобы было именно 7 элементов (т.к. дневная таблица разбивается на семь) с инкрементом в значение 4, причем чтобы первый был бы 03, второй 07 (т.е. с нулями впереди) а потом этот ноль убирался бы и шло 11, 15, 19, 23

делать сеть запросов и объединить юнионом?

set @tmp3 = 'Select * from T_Table_' + @tmp2 + '_03_00_00 where [Pole1]= 123
uninon
'Select * from T_Table_' + @tmp2 + '_07_00_00 where [Pole1]= 123
uninon
...
21 ноя 13, 22:40    [15170985]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
SERG1257
Member

Откуда:
Сообщений: 2864
А все нормальные варианты решения вашей задачи (кстати какой) уже рассмотрены и признаны негодными?
21 ноя 13, 22:54    [15171040]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
SERG1257
А все нормальные варианты решения вашей задачи (кстати какой) уже рассмотрены и признаны негодными?


подайте идею пожалуйста
21 ноя 13, 23:03    [15171077]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
SERG1257
Member

Откуда:
Сообщений: 2864
Озвучьте задачу и граничные условия.
Что мешает решить задачу "в лоб" - генерацией скрипта?
Если эта задача периодическая - что мешает сделать вьюху или набор вьюх.

Ольга Семенова
03, второй 07 (т.е. с нулями впереди)

declare @i int
set @i=3
select right('0'+cast(@i as varchar),2)
21 ноя 13, 23:15    [15171146]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
ну а как это сделать?

Как написать цикл с начальным значением 3, шагом 4 и максимальным значением 23 ???
Вы шутите что ли ?
21 ноя 13, 23:26    [15171192]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

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

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

а другой БД в день делаются аж 7 таблиц. каждые 4 часа - что и отражается в ее названии
мне нужно добавить подцикл по этим семи таблица каждого дня

а идея у меня была только что сделать временную таблицу TempTable с одним полем и туда заполнить эти 7 записей и тогда будет так. беру даные и помещаю в курсор

DECLARE @tmp1 varchar(200), @tmp2 varchar(200), @tmp3 varchar(500)

SET @date_from = CAST('2013-01-01' AS datetime)
SET @date_to = CAST('2013-11-21' AS datetime)

Declare My_cursor cursor local  FOR 
Select * From TempTable
 
WHILE @date_from < @date_to
  BEGIN
  set @tmp1 = CONVERT(CHAR(10),@date_from,120)
  set @tmp2 = REPLACE(@tmp1, '-', '_')
  Open My_cursor
   Fetch next from My_cursor into @var2
     WHILE @@Fetch_STATUS=0
      BEGIN 
         set @tmp3 = 'Select * from T_Table_' + @tmp2 + '_' + @var2 + '_00_00 where [Pole1]= 123'
         EXEC(@tmp3)
         Fetch next from My_cursor into @var2
     END
    Close My_cursor
    Deallocate My_cursor  
  SET @date_from = DATEADD(day, 1, @date_from)
END
21 ноя 13, 23:27    [15171194]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
Glory
Ольга Семенова
ну а как это сделать?

Как написать цикл с начальным значением 3, шагом 4 и максимальным значением 23 ???
Вы шутите что ли ?

что-то типа такого?

set @var=0
while @var<24
begin

set @var=@var+3
end

и как условие добавить чтобы число если 3 или 7 то его переводить в строковый тип и добывлять ноль вперед
21 ноя 13, 23:32    [15171212]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
а идея у меня была только что сделать временную таблицу TempTable с одним полем и туда заполнить эти 7 записей и тогда будет так. беру даные и помещаю в курсор

Подумайте лучше над идеей выбирать имена таблиц из системной таблицы
21 ноя 13, 23:32    [15171216]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
SERG1257
Member

Откуда:
Сообщений: 2864
Ольга Семенова
задача простая - проитись по тамблицам из БД - они создаются каждый день
После создания таблиц создайте вьюшку объединяющую их, затем запрашивайте ее.
21 ноя 13, 23:33    [15171222]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ольга Семенова
и как условие добавить чтобы число если 3 или 7 то его переводить в строковый тип и добывлять ноль вперед

руками прямо так и добавить
21 ноя 13, 23:33    [15171225]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
o-o
Guest
блин, ну кроме дней же можно добавлять часы.
вот такое вам надо???
DECLARE @tmp1 varchar(200), @tmp2 varchar(200), @tmp3 varchar(500)
declare @date_from datetime = '20130101 03:00:00'
declare @date_to datetime = CAST('2013-11-21' AS datetime)

WHILE @date_from < @date_to
  BEGIN
    set @tmp1 = CONVERT(CHAR(19),@date_from,120)
    set @tmp2 = REPLACE(REPLACE(REPLACE(@tmp1, '-', '_'), ':', '_'), ' ', '_')
    set @tmp3 = 'Select * from T_Table_' + @tmp2 + ' where [Pole1]= 123'
   print @tmp3
    SET @date_from = DATEADD(hh, 4, @date_from)
 END
-----------------------------------------------------------
Select * from T_Table_2013_01_01_03_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_07_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_11_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_15_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_19_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_23_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_03_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_07_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_11_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_15_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_19_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_23_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_03_03_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_03_07_00_00 where [Pole1]= 123
...
21 ноя 13, 23:46    [15171265]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
o-o
блин, ну кроме дней же можно добавлять часы.
вот такое вам надо???
DECLARE @tmp1 varchar(200), @tmp2 varchar(200), @tmp3 varchar(500)
declare @date_from datetime = '20130101 03:00:00'
declare @date_to datetime = CAST('2013-11-21' AS datetime)

WHILE @date_from < @date_to
  BEGIN
    set @tmp1 = CONVERT(CHAR(19),@date_from,120)
    set @tmp2 = REPLACE(REPLACE(REPLACE(@tmp1, '-', '_'), ':', '_'), ' ', '_')
    set @tmp3 = 'Select * from T_Table_' + @tmp2 + ' where [Pole1]= 123'
   print @tmp3
    SET @date_from = DATEADD(hh, 4, @date_from)
 END
-----------------------------------------------------------
Select * from T_Table_2013_01_01_03_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_07_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_11_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_15_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_19_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_01_23_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_03_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_07_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_11_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_15_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_19_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_02_23_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_03_03_00_00 where [Pole1]= 123
Select * from T_Table_2013_01_03_07_00_00 where [Pole1]= 123
...


да - так точно. блин - как все таки здесь в SQL много всяких функций по преобразованию дат . как вы их все знаете ?
21 ноя 13, 23:52    [15171293]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
Glory
Ольга Семенова
а идея у меня была только что сделать временную таблицу TempTable с одним полем и туда заполнить эти 7 записей и тогда будет так. беру даные и помещаю в курсор

Подумайте лучше над идеей выбирать имена таблиц из системной таблицы


если помещать в курсор выборку
select * from sysobjects where type = 'U'
то и другие таблицы БД попадут - их тоже много. Их как то можно отсечь ? по какому признаку? like ом?
21 ноя 13, 23:55    [15171310]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
SERG1257
Ольга Семенова
задача простая - проитись по тамблицам из БД - они создаются каждый день
После создания таблиц создайте вьюшку объединяющую их, затем запрашивайте ее.


подскажите на будущее - как делаются объединяющие вьюшки
каждая таблица примерно по полмилиона записей - вьюшка не надорвется ?
21 ноя 13, 23:57    [15171320]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
SERG1257
Member

Откуда:
Сообщений: 2864
Ольга Семенова
подскажите на будущее - как делаются объединяющие вьюшки

http://technet.microsoft.com/en-us/library/ms180026(v=sql.90).aspx

Ольга Семенова
каждая таблица примерно по полмилиона записей - вьюшка не надорвется ?
Смотрите в план с вашим условием [Pole1]= 123.
22 ноя 13, 00:26    [15171415]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
SERG1257
Member

Откуда:
Сообщений: 2864
В смысле не надо делать union, надо union all
По производительности должно быть как минимум не хуже чем ваш курсор. По удобству - на порядок лучше.
22 ноя 13, 00:31    [15171435]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Опять грёбаная муторная императивщина.
Может при наличии слова WHILE в коде потребовать ввода капчи?!

На правах Роспотребнадзора.

Столько узкомыслия.
    set @tmp3 = '
Select * from T_Table_' + @tmp2 + '_00_00_00 where [Pole1]= 123
Select * from T_Table_' + @tmp2 + '_03_00_00 where [Pole1]= 123
Select * from T_Table_' + @tmp2 + '_07_00_00 where [Pole1]= 123
Select * from T_Table_' + @tmp2 + '_11_00_00 where [Pole1]= 123
Select * from T_Table_' + @tmp2 + '_15_00_00 where [Pole1]= 123
Select * from T_Table_' + @tmp2 + '_19_00_00 where [Pole1]= 123
Select * from T_Table_' + @tmp2 + '_23_00_00 where [Pole1]= 123
'
...
    set @tmp3 += 'Select ...'
    SET @date_from = DATEADD(day, 1, @date_from)
END
EXEC(@tmp3)
Вариант в один запрос через master.dbo.spt_values

Но главное, грёбаня привычка создавать и удалять таблицы.
ALTER TABLE dbo.T_Table ADD [Data] DateTime NOT NULL DEFAULT GetDate()
Сложнее, доп инфа?:
ALTER TABLE dbo.T_Table ADD LoadID Int NOT NULL REFERENCES dbo.Load(ID)
И нафег динамика.
Динамика нужна для разработки, но не в работе.

Стыд и позор. Не, не от незнания, а от лени думать.
22 ноя 13, 04:29    [15171783]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Mnior,

спокойнее

кмк, человек не ответственен за наполнение и/или структуру базы, но имеет в обязанностях собирать из неё инфу/строить какие-то отчеты (хотя и плохо пока владеет инструментом).


ну и, опять таки, не имея достаточной информации о назначении/структуре/особенностях БД - сразу давать совет "а давайте мы это всё поменяем/реструктуризуем" - это немного опрометчиво.
22 ноя 13, 04:40    [15171784]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Ольга Семенова
Member

Откуда:
Сообщений: 738
locky
Mnior,

спокойнее

кмк, человек не ответственен за наполнение и/или структуру базы, но имеет в обязанностях собирать из неё инфу/строить какие-то отчеты (хотя и плохо пока владеет инструментом).


да - имеено так.
22 ноя 13, 08:17    [15171967]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Ольга Семенова,

declare @SQL varchar(max)
set @SQL = ''

select top 100500 @SQL = @SQl + 'union all select * from ['+s.name+'].['+o.name +'] where Pole1 = 123' + char(13)+char(10)
from sys.objects o with(nolock)
join sys.schemas s with(nolock) on s.schema_id = o.schema_ID
where
		o.name like 'T_Table_%' -- имена ваших таблиц
and		o.type = 'U'                  --- чтобы только таблицы
order by o.create_date asc

set @SQL = substring(@SQL, 11, 999999999) -- уберем первый union all 

--- если нужно создать вид - то раскоментить ЭТО и убрать строку  "where Pole1 = 123" в четвертой строке сверху.
/*set @SQL = 
'alter view vmp_T_Table_ALL 
-- вид пересоздан: '+convert(varchar(32), getdate(), 127)+', пользователь:'+suser_name()+' 
AS ('+char(13)+char(10)+@SQL + '/**/ )' */

print @SQL
exec(@SQL)



Но еще круче будет создать ddl триггер и в нем анализировать - если произошло создание или удаление таблицы с именем T_Table_%
то перегенерировать view - динамически собирая его код.
22 ноя 13, 09:24    [15172148]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
Jaffar
Member

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

или просто каждый раз когда вам нужно пересоздавайте вид посредствам выполнения этого кода.
или лучше суньте его в процедуру и вызывайте ее когда нужно.
22 ноя 13, 09:26    [15172157]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Ольга Семенова
как все таки здесь в SQL много всяких функций по преобразованию дат . как вы их все знаете ?


http://msdn.microsoft.com/ru-ru/library/ms186724(SQL.90).aspx

даже не выучить, а знать о 10 функциях, из которых всего парочка чаще всего используется, уже за чудо воспринимается?? ))

как же люди учат тот же японский, с 20 тысячами иероглифов?

SERG1257
declare @i int
set @i=3
select right('0'+cast(@i as varchar),2)


стремно.
завтра поставят @i=101, и начнется "неуловимый баг"

лучше уже через case @i<10 then '0'+...
22 ноя 13, 10:49    [15172533]     Ответить | Цитировать Сообщить модератору
 Re: Массив из 7 ми элементов и цикл по его содержимому  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
StarikNavy
как же люди учат тот же японский, с 20 тысячами иероглифов?
Не надо преувеличивать. Около 3 тысяч.
Это же не Китай!
В японском языке свои заморочки. :))
22 ноя 13, 12:47    [15173408]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить