在表值函数SQL Server中使用Execute()方法

Lah*_*hib 2 sql sql-server sql-function

我试图在SQL Server中创建一个表值函数.我的问题是我找不到适合SQL的语法.我一直在收到错误.我不知道是否可以execute()在表值函数中使用方法.我尝试声明和设置变量,并在oridinary sql查询中使用execute方法,它的工作原理.

我的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 ' +@Daynameofweek+' =1';

    RETURN 
    (
        execute(@cmdtext)
    )
GO
Run Code Online (Sandbox Code Playgroud)

到目前为止我的错误是:

消息156,级别15,状态1,过程SortRoutePartByDay,第21行
关键字'execute'附近的语法不正确.
消息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]
Run Code Online (Sandbox Code Playgroud)

Dev*_*art 5

我认为在你的情况下使用动态SQL是不必要的,所以试试这个 -

查询:

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

小信息:

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)
Run Code Online (Sandbox Code Playgroud)