2016-07-28 3 views
-1

Я пытаюсь вставить ежегодные детали в выходные дни, такие как дата, DAYNAME в таблицу SQL Server, используя следующую хранимую процедуруВставка выходных в таблицу SQL Server

alter procedure usp_AddOfficeHolidays 
    @paramName NVARCHAR(max) 
as 
begin 
    DECLARE @Year AS INT, 
      @FirstDateOfYear DATETIME, 
      @LastDateOfYear DATETIME 

    -- You can change @year to any year you desire 
    SELECT @year = 2016 

    SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0) 
    SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0) 

    -- Creating Query to Prepare Year Data 
    --declare dayN varchar(max) 
    if (select COUNT(*) from tblWeekSettings) < 1 
    begin 
     ;WITH cte AS 
     (
      SELECT 
       1 AS DayID, 
       @FirstDateOfYear AS FromDate, 
       DATENAME(dw, @FirstDateOfYear) AS Dayname 
      UNION ALL 
      SELECT 
       cte.DayID + 1 AS DayID, 
       DATEADD(d, 1 ,cte.FromDate), 
       DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname 
      FROM cte 
      WHERE DATEADD(d, 1, cte.FromDate) < @LastDateOfYear 
     ) 
     SELECT FromDate AS Date, Dayname 
     FROM CTE 
     WHERE DayName IN (SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 
     OPTION (MaxRecursion 370) 
    end 
    else 
    begin 
     Select 'Exists' 
    end 
end 

и исполняющего его с помощью

exec usp_AddOfficeHolidays 'Saturday,Sunday' 

, которая возвращает следующий результат

enter image description here

Это отлично работает, НО я не смог добавить/вставить эти данные в следующей таблице

enter image description here

сталкиваюсь следующее сообщение об ошибке при попытке получить доступ к деталям уикэнд его псевдонимом КТР

The statement terminated. The maximum recursion 100 has been exhausted before statement completion

Хотя я добавил пункт

OPTION (MaxRecursion 370) 

предложили этим ссылки, которые я нашел на переполнении стека

EDIT

В основном я сталкиваюсь с указанной ошибкой, когда я пытаюсь что-то вроде этого

alter procedure usp_AddOfficeHolidays 
@paramName NVARCHAR(max) 
as 
begin 
---------------------------------------------------------- 
DECLARE @Year AS INT, 
@FirstDateOfYear DATETIME, 
@LastDateOfYear DATETIME 
-- You can change @year to any year you desire 
SELECT @year = 2016 
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0) 
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0) 
-- Creating Query to Prepare Year Data 
--declare dayN varchar(max) 
if (select COUNT(*) from tblWeekSettings) < 1 

    begin 
     ;WITH cte AS (
     SELECT 1 AS DayID, 
     @FirstDateOfYear AS FromDate, 
     DATENAME(dw, @FirstDateOfYear) AS Dayname 
     UNION ALL 
     SELECT cte.DayID + 1 AS DayID, 
     DATEADD(d, 1 ,cte.FromDate), 
     DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname 
     FROM cte 
     WHERE DATEADD(d,1,cte.FromDate) < @LastDateOfYear 
     ) 



     SELECT FromDate AS Date, Dayname 
     FROM CTE 
     WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 

     insert into tblWeekSettings(DayNo,WeekDayName,Dates) 
     values('',Dayname,Date) 

     OPTION (MaxRecursion 370) 
    end 

else 
    begin 
     Select 'Exists' 
    end 


--select cte 
----------------------------------------------------------- 
end 

Мне нужна помощь здесь! Мне просто нужно вставить данные в мою указанную таблицу!

Спасибо!

+0

'если (выберите COUNT (*) из tblWeekSettings) < 1' ->', если не существует (выберите 1 из TBL ...) ' –

+0

Показать сообщение об ошибке полное имя с зр, номер строки и так далее. –

+0

@ivanStarostin Эта хранимая процедура WORKS отлично, мне просто нужно вставить данные в таблицу, о которых я упомянул в своем вопросе! –

ответ

1

Это ошибка:

SELECT FromDate AS Date, Dayname 
    FROM CTE 
    WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 

Я разделил этот код, чтобы вы поняли, что код на самом деле работает в этом случае:

insert into tblWeekSettings(DayNo,WeekDayName,Dates) 
    values('',Dayname,Date) 
    OPTION (MaxRecursion 370) 

OPTION (MAX RECURSION) теперь принадлежит к одной инструкции вставки. Что является автономным, полностью не связанным с CTE.

Вы на самом деле нужно, я полагаю:

;with CTE (...) 
    insert into tblWeekSettings(DayNo,WeekDayName,Dates) 
    SELECT FromDate AS Date, Dayname 
    FROM CTE 
    WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 
    OPTION (MaxRecursion 370) 

но есть три столбца в таблице назначения в то время как ваши отборных имеет только два столбцов. Поэтому вам нужно будет обновить свой выбор.

Некоторые советы о INSERT-SELECT:
http://www.w3schools.com/sql/sql_insert_into_select.asp

этот код:

insert into tblWeekSettings(DayNo,WeekDayName,Dates) 
    values('',Dayname,Date) 

не имеет какого-либо источника для вставки. Это недопустимый код - здесь нет никаких переменных Dayname,Date - они не имеют ссылок на @ в качестве переменных. Это абсолютно недействительный код.

+0

Как вы ожидаете получить VALUES в tblWeekСеть? Просто любопытно! –

+0

Вот что делает инструкция 'INSERT ... SELECT'. –

+0

@AimalKhan вы должны принять этот ответ, если он правильный. –

0

Для тех, кто сталкиваются следующие вопросы

  • Getting Weeked детали т.е. DAYNAME Дата
  • Вставка в таблицу

Эта хранимая процедура будет делать трюк.

alter procedure usp_AddOfficeHolidays 
@paramName NVARCHAR(max) 
as 
begin 
---------------------------------------------------------- 
DECLARE @Year AS INT, 
@FirstDateOfYear DATETIME, 
@LastDateOfYear DATETIME 
-- You can change @year to any year you desire 
SELECT @year = 2016 
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0) 
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0) 
-- Creating Query to Prepare Year Data 
--declare dayN varchar(max) 
if (select COUNT(*) from tblWeekSettings) < 1 

    begin 
     ;WITH cte AS (
     SELECT 1 AS DayID, 
     @FirstDateOfYear AS FromDate, 
     DATENAME(dw, @FirstDateOfYear) AS Dayname 
     UNION ALL 
     SELECT cte.DayID + 1 AS DayID, 
     DATEADD(d, 1 ,cte.FromDate), 
     DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname 
     FROM cte 
     WHERE DATEADD(d,1,cte.FromDate) < @LastDateOfYear 
     ) 


     insert into tblWeekSettings(DayNo,Dates,WeekDayName) 
     SELECT '',FromDate AS Date, Dayname 
     FROM CTE WHERE DayName IN(SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 

     OPTION (MaxRecursion 30000) 




    end 

else 
    begin 
     Select 'Exists' 
    end 


--select cte 
----------------------------------------------------------- 
end 

Плюс эта статья действительно может быть полезна.

0

Попробуйте это, я надеюсь, что это полезно для вас.

alter procedure usp_AddOfficeHolidays 
@paramName NVARCHAR(max) 
as 
begin 
---------------------------------------------------------- 
DECLARE @Year AS INT,@DayNo as int=1, 
@FirstDateOfYear DATETIME, 
@LastDateOfYear DATETIME 
-- You can change @year to any year you desire 
SELECT @year = 2016 
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0) 
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0) 
Select getdate() DateOfYear into #tbl where 1=0 
-- Creating Query to Prepare Year Data 
--declare dayN varchar(max) 
if (select COUNT(*) from tblWeekSettings) < 1 

    begin 
      while (@FirstDateOfYear< @LastDateOfYear) 
      begin 
       Insert Into #tbl (DayNo,DateOfYear) values (@DayNo,@FirstDateOfYear) 
       set @FirstDateOfYear+=1 
       set @DayNo+=1; 
      End 

      Insert Into tblWeekSettings (DayNo,WeekDayName,Dates) 
      SELECT DayNo,DATENAME(dw, DateOfYear) Name,DateOfYear AS Date 
      FROM #tbl 
      WHERE DATENAME(dw, DateOfYear) IN(SELECT Param FROM dbo.fn_MVParam(@paramName,',')) 

    end 

else 
    begin 
     Select 'Exists' 
    end 


--select cte 
----------------------------------------------------------- 
end 
+0

Спасибо за ваш комментарий @ m.jamshaidAlam Но я получил ответ! –

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