2016-07-28 60 views
-1

我試圖插入每年週末的詳細信息,如日期,DAYNAME到使用插入到週末SQL Server表

exec usp_AddOfficeHolidays 'Saturday,Sunday' 
使用以下存儲過程

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 

並執行一個SQL Server表

其返回以下結果

enter image description here

這工作完全正常,我一直無法添加/插入這些細節如下表

enter image description here

我面對下面的錯誤到,當我試圖通過它的別名CTE訪問WEEKEND細節

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 

An y在這裏的幫助真的很感謝!我只需要將數據插入到指定的表中!

謝謝!

+0

'如果(SELECT COUNT(*)從tblWeekSettings)< 1' ->'如果不存在(選擇1從TBL ...)用菌名,行號等等' –

+0

顯示完整的錯誤消息。 –

+0

@ivanStarostin這個存儲過程工作正常,我只需要將數據插入到我的問題中提到的我的表中! –

回答

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進入tblWeekSettings?只是好奇! –

+0

這就是'INSERT ... SELECT'語句所做的。 –

+0

@AimalKhan你應該接受這個答案,如果它是正確的。 –

0

對於任何人誰面臨以下問題

  • 獲取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但我得到了答案! –