2016-09-01 2 views
1

Я хочу изменить свой SQL-код, который генерирует п таблицу с помощью двух вложенных в то время как петли, как:Вложенные циклы While в SQL?

DECLARE @count1 INT 
SET @count1 = 2012 
DECLARE @count2 INT 
SET @count2 = 1 
WHILE @count1 <= 2016 
BEGIN 
WHILE @count2 <= 12 
    create table LGDfigRecov as 
select ... 
from ... 
WHERE FD0.mo_id=count2 
    AND FD0.an_id= count1 
... 
SET @count2 += 1 
END 
SET @count1 += 1 
END 

Как я могу изменить каждый раз, когда имя новой таблицы, как «LGDfigRecov + Count1 + count2»? Это означает, что я хочу создавать каждый раз новую таблицу с именем года и месяца в конце.

+0

Динамический SQL - это значит, вы строите строку вашей команды SQL в SQL, а затем выполнить строку. –

+0

Как насчет * one * table с столбцами, содержащими count1, count2 –

+0

Прежде всего SQL SERVER не позволяет создать таблицу, подобную этой таблице создания таблицы LGDfigRecov как select ... 'вам нужен динамический запрос –

ответ

1

Вы можете использовать такой запрос, чтобы создать свои заявления.

WITH 
MonthNumbers AS (SELECT * FROM(VALUES('01'),('02'),('03'),('04'),('05'),('06'),('07'),('08'),('09'),('10'),('11'),('12')) AS x(MonthNr)) 
,YearNumbers AS (SELECT * FROM(VALUES('2012'),('2013'),('2014'),('2015'),('2016')) AS x(YearNr)) 
SELECT ROW_NUMBER() OVER(ORDER BY YearNr,MonthNr) AS SortInx 
     ,CONCAT('CREATE TABLE LGDfigRecov_',YearNr,'_',MonthNr,' AS ', CHAR(13) + CHAR(10)) + 
     CONCAT('SELECT ... FROM ... ', CHAR(13) + CHAR(10)) + 
     CONCAT('WHERE FD0.mo_id=',MonthNr,' AND FD0.an_id=',YearNr,';') AS Cmd 
FROM MonthNumbers 
CROSS JOIN YearNumbers 

Я всегда стараюсь, чтобы избежать ненужных петель и процедурных подходов ...

  • Проверьте их, если они допустимый синтаксис (просто скопировать вывод в новом окне запроса)
  • открыть CURSOR из этого SELECT
  • Используйте CURSOR для извлечения этого строчного в переменную @Cmd
  • использование EXEC (@Cmd)
+0

К сожалению, следующая ошибка: ОШИБКА: Заявление недействительно или используется из-за правильного порядка. – maniA

+0

Попробуйте скопировать весь набор результатов в новое окно запроса и проверить наличие синтаксических ошибок. Вы должны, конечно, заменить «SELECT ... FROM ...» правильными именами столбцов и таблиц подходящих ... При внедрении идентификатора 'CURSOR' советуем добавить' PRINT @ Cmd' и исключить комментарий ' EXEC (@Cmd) '. Таким образом, вы можете повторно проверить операторы, которые будут выполняться. – Shnugo

1

Ниже приведен код, который поможет вам достичь цели.

DECLARE @count1 INT, @w_SQL nvarchar(4000); SET @count1 = 2012 DECLARE @count2 INT SET @count2 = 1 WHILE @count1 <= 2016 BEGIN WHILE @count2 <= 12 SET @w_SQL = 'create table LGDfigRecov' + CONVERT(nvarchar(10), @count1) + CONVERT(nvarchar(10), @count2) + 'as select ... from ... WHERE FD0.mo_id=count2 AND FD0.an_id= count1 ...'
EXEC sp_executesql @w_SQL SET @count2 += 1 END SET @count1 += 1

+0

Доза не работает, возможно, потому что я использую sql внутри SAS. Однако, спасибо! – maniA

Смежные вопросы