2013-07-18 5 views
2

SQL Server에서 테이블 반환 함수를 만들려고합니다. 내 문제는 내가 SQL에 대한 올바른 구문을 찾을 수 없다는 것입니다. 나는 오류가 계속 발생합니다. 테이블 반환 함수에서 execute() 메서드를 사용할 수 있는지 여부는 알 수 없습니다. 선언하고 변수를 설정하고 또한 oridinary sql 쿼리에서 execute 메서드를 사용하여 시도하고 작동합니다.테이블 반환 함수에서 Execute() 메서드 사용 SQL Server

내 SQL :

CREATE FUNCTION SortRoutePartByDay 
( 
    @date datetime 
) 
RETURNS TABLE 
AS 
Begin 
    declare @cmdtext varchar(max) 
    declare @Daynameofweek varchar(10) 
    set @Daynameofweek = datename(weekday, @date) 
    set @cmdtext = 'select * from RoutePartPart where ' [email protected]+' =1'; 

    RETURN 
    (
     execute(@cmdtext) 
    ) 
GO 

내 오류가 지금까지입니다 :

키워드 근처 21
의 구문이 잘못되었습니다 '실행'메시지 156, 수준 15, 상태 1, 프로 시저 SortRoutePartByDay, 라인 .
메시지 102, 수준 15, 상태 1, 프로 시저 SortRoutePartByDay, 줄 23
')'근처에 구문이 잘못되었습니다.

RoutePartPart DDL :

CREATE TABLE [dbo].[RoutePartPart](
     [RouteID] [int] NOT NULL, 
     [RoutePartNo] [smallint] NOT NULL, 
     [RoutePartPartNo] [smallint] NOT NULL, 
     [PickupAreaGrpID] [int] NULL, 
     [DeliveryAreaGrpID] [int] NULL, 
     [Monday] [bit] NULL, 
     [Tuesday] [bit] NULL, 
     [Wednesday] [bit] NULL, 
     [Thursday] [bit] NULL, 
     [Friday] [bit] NULL, 
     [Saturday] [bit] NULL, 
     [Sunday] [bit] NULL, 
     [Pickup] [bit] NULL, 
     [Delivery] [bit] NULL, 
     [Types] [varchar](10) NULL 
    ) ON [PRIMARY] 

답변

5

I 동적 SQL을 사용하여 귀하의 경우 필요하므로이 하나하려고 생각 -

검색어 :

CREATE FUNCTION SortRoutePartByDay 
( 
    @date DATETIME 
) 
RETURNS TABLE 
AS RETURN 
    SELECT * 
    FROM dbo.RoutePartPart 
    WHERE DATENAME(weekday, @date) = 1 

작은 정보를 :

SQL Server의 함수는 저장 프로 시저와 같지 않으므로 수행 할 수있는 작업에는 몇 가지 제한 사항이 있습니다. 예를 들어, 동적 SQL을 사용할 수 없습니다.

업데이트 :

CREATE FUNCTION SortRoutePartByDay 
( 
    @date DATETIME 
) 
RETURNS TABLE 
AS RETURN 
    SELECT p.* 
    FROM dbo.RoutePartPart p 
    CROSS JOIN (
      SELECT [WeekDay] = DATENAME(weekday, @date)  
    ) t 
    WHERE ([WeekDay] = 'Monday' AND [Monday] = 1) 
      OR ([WeekDay] = 'Tuesday' AND [Tuesday] = 1) 
      OR ([WeekDay] = 'Wednesday' AND [Wednesday] = 1) 
      OR ([WeekDay] = 'Thursday' AND [Thursday] = 1) 
      OR ([WeekDay] = 'Friday' AND [Friday] = 1) 
      OR ([WeekDay] = 'Saturday' AND [Saturday] = 1) 
      OR ([WeekDay] = 'Sunday' AND [Sunday] = 1) 
+1

한 수정,하지만 어쩌면 무엇이 잘못되었는지 clarrify하려고합니다. 다중/단일 명령문 테이블 함수의 차이점은 무엇입니까? 함수 내에서 부작용 연산자 'INSERT EXEC'를 잘못 사용했습니다. –

+0

@Daynameofweek 매개 변수는 테이블의 열입니다. 이 방법은 nvarchar 값 "목요일"을 int 1과 비교합니다. 값 1 인 모든 행을 가져와야하기 때문에 요일은 열이어야합니다. – Lahib

+0

@Lahib, OK. 테이블의 DDL을 제공 할 수 있습니까? – Devart