Есть ли способ создать массив таблиц (или динамически создаваемых таблиц) на основе динамического значения?Например, я знаю, что в C ++ вы можете использовать указатели и динамическую память, но мне нужно сделать что-то подобное в SQL.
Пользователь указывает, что он хочет видеть данные за X лет для каждого года. Нам нужно увидеть более 15 столбцов, которые можно встроить во временную таблицу (идентичные для каждого года).
пользователь выбирает данные 5
лет и текущий год как 2018
, поэтому я хочу динамически создать локальную таблицу для 2018, 2017, 2016, 2015 and 2014.
Каждая таблица будет отслеживать данные клиентов, продажи и т. Д. То же для каждогоТаблица.
, если вышеприведенное невозможно, можем ли мы ограничить пользователя только выбором года и динамически всегда придерживаться, например, 5 лет.Пользователь указывает, что он хочет начать с 2017
, и мы по умолчанию создадим для него 2017, 2016 ... 2013.
Я могу пойти дальше и сказать, создать таблицу #year1, #year2, #year3 etc.
Но это требует много кодирования (в основном копирование и вставказаблаговременно).Есть ли способ избежать этого - например, создать таблицу #years[]
или указатель?а затем динамически построить какой-то массив таблицы #years.
То, что мы в итоге сделаем, будет проходить через один и тот же запрос / логику, извлекая из года в год одни и те же наборы данных.Затем в конце сравниваем кто / в какой год и каким образом.Суть в том, чтобы не копировать и не вставлять одни и те же операторы объявления / выбора / вставки 5 или более раз?(и если это вообще возможно, чтобы избежать курсоров / циклов)
Я пытался кодировать что-то вроде этого
DECLARE @season_counter int = 5
DECLARE @cnt int = 0
Declare @cnt_v varchar(1) = CONVERT(varchar(10), @cnt)
DECLARE @SQL NVARCHAR(max) = ''
WHILE @cnt <= @season_counter
BEGIN
select @SQL = @SQL + ' create table #year' + @cnt_v
+ ' (customer_no int, order_no int, perf_no int, due_amt money, paid_amt money, status int ) '
exec sp_executesql @SQL
print @SQL
set @cnt = @cnt + 1
set @cnt_v = CONVERT(varchar(10), @cnt)
set @sql = ''
END
select * from #year1
select * from #year2
Выше сгенерированные ошибки
Msg 208, Level 16, State 0, Line 81
Invalid object name '#year1'.
IЯ не могу использовать глобальные переменные, и я уверен, что, черт возьми, не хочу объявлять операторы Create для 20 таблиц (как некоторое максимальное значение).Я хочу, чтобы он был динамичным и на лету.Пожалуйста, порекомендуйте.