我正在尝试在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
到目前为止我的错误是:
Msg 156,Level 15,State 1,Procedure SortRoutePartByDay,Line 21
关键字'execute'附近的语法不正确。
Msg 102,Level 15,State 1,Procedure SortRoutePartByDay,Line 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]
答案 0 :(得分:5)
我认为在你的情况下使用动态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)