2016-09-21 52 views
0

我已经写了一个内联TVF,我有这个到目前为止。我得到这个错误:近端语法不正确。有人可以为此提出解决方法。我真的可以用语法的方式做到这一点吗,它是正确的吗?内联表值函数sql服务器问题

CREATE FUNCTION [hsip].[Question_Dtl_Table_Id] 
( 
    -- Add the parameters for the function here 
    @cRegion CHAR(2) ='00', 
    @cState_Code CHAR(2) = '00', 
    @nFY NUMERIC(4,0) = 0, 
    @nREPORT_ID NUMERIC(2,0) = 0, 
    @nSECTION_ID NUMERIC(2,0) = 0, 
    @nSUBSECTION_ID NUMERIC(2,0) = 0, 
    @nDISPLAY_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_PART_NUMBER NUMERIC(38,0) = 0, 
    @sUSER_ID VARCHAR(25) = NULL 

) 
RETURNS @tbl TABLE (Region CHAR(2), 
    State_Code CHAR(2), 
    FY NUMERIC(4,0), 
    REPORT_ID NUMERIC(2,0), 
    SECTION_ID NUMERIC(2,0), 
    SUBSECTION_ID NUMERIC(2,0), 
    DISPLAY_NUMBER NUMERIC(38,0), 
    QUESTION_NUMBER NUMERIC(38,0), 
    QUESTION_PART_NUMBER NUMERIC(38,0), 
    USER_ID VARCHAR(25)) 

AS 
--RETURN 
begin 

INSERT INTO @tbl 


select * from (SELECT qi.REGION, qi.STATE_CODE, qi.FY, qi.REPORT_ID, qi.SECTION_ID, qi.SUBSECTION_ID, qi.DISPLAY_NUMBER, 
    qi.QUESTION_NUMBER, qd.QUESTION_PART_NUMBER from 
    FY_ST_QUESTION_INFO qi 
    inner join 
    FY_ST_QUESTION_DETAIL qd 
    on qi.FY_ST_QUESTION_INFO_TABLE_ID= qd.FY_ST_QUESTION_INFO_TABLE_ID 
    where qi.region= @cRegion 
    and qi.fy= @nFY 
    and qi.REPORT_ID = @nREPORT_ID 
    and qi.SECTION_ID = @nSECTION_ID 
    and qi.SUBSECTION_ID = @nSUBSECTION_ID 
    and qi.DISPLAY_NUMBER [email protected]_NUMBER 
    and (qi.REPORTER_ID = @sUSER_ID or 
    qi.DELEGATE_ID= @sUSER_ID or 
    qi.SUB_DELEGATE_ID = @sUSER_ID)); 
return; 
end 

感谢

+1

这不是一个内联表值函数(ITVF),但多语句表值函数(MTVF) –

+0

而且你缺少你选择statment USER_ID。 –

回答

1

你需要一个别名添加到您的派生查询..

INSERT INTO @tbl 
       SELECT * 
       FROM (SELECT 
         ) AS T -- alias 
    ; 
+0

谢谢。我的查询现在可用。在结束之前,必须添加别名表名称。 – user3147594

2

蒂姆在评论这已经提到的是不是一个内嵌表值函数,但一个多语句表值函数。这里的区别是性能。 MTVF的表现通常比标量函数更差。不过,稍作修改,可以轻松将其转换为ITVF。

CREATE FUNCTION [hsip].[Question_Dtl_Table_Id] 
( 
    -- Add the parameters for the function here 
    @cRegion CHAR(2) ='00', 
    @cState_Code CHAR(2) = '00', 
    @nFY NUMERIC(4,0) = 0, 
    @nREPORT_ID NUMERIC(2,0) = 0, 
    @nSECTION_ID NUMERIC(2,0) = 0, 
    @nSUBSECTION_ID NUMERIC(2,0) = 0, 
    @nDISPLAY_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_PART_NUMBER NUMERIC(38,0) = 0, 
    @sUSER_ID VARCHAR(25) = NULL 

) RETURNS TABLE AS RETURN 

    SELECT qi.REGION 
     , qi.STATE_CODE 
     , qi.FY 
     , qi.REPORT_ID 
     , qi.SECTION_ID 
     , qi.SUBSECTION_ID 
     , qi.DISPLAY_NUMBER 
     , qi.QUESTION_NUMBER 
     , qd.QUESTION_PART_NUMBER 
    from FY_ST_QUESTION_INFO qi 
    inner join FY_ST_QUESTION_DETAIL qd on qi.FY_ST_QUESTION_INFO_TABLE_ID = qd.FY_ST_QUESTION_INFO_TABLE_ID 
    where qi.region = @cRegion 
     and qi.fy = @nFY 
     and qi.REPORT_ID = @nREPORT_ID 
     and qi.SECTION_ID = @nSECTION_ID 
     and qi.SUBSECTION_ID = @nSUBSECTION_ID 
     and qi.DISPLAY_NUMBER = @nDISPLAY_NUMBER 
     and 
     (
      qi.REPORTER_ID = @sUSER_ID 
      or 
      qi.DELEGATE_ID = @sUSER_ID 
      or 
      qi.SUB_DELEGATE_ID = @sUSER_ID 
     ) 
0

您最外面的选择是多余的,并且没有内部选择所需的别名。而不是添加一个别名我会通过去除纠正:

CREATE FUNCTION [hsip].[Question_Dtl_Table_Id] 
( 
    -- Add the parameters for the function here 
    @cRegion CHAR(2) ='00', 
    @cState_Code CHAR(2) = '00', 
    @nFY NUMERIC(4,0) = 0, 
    @nREPORT_ID NUMERIC(2,0) = 0, 
    @nSECTION_ID NUMERIC(2,0) = 0, 
    @nSUBSECTION_ID NUMERIC(2,0) = 0, 
    @nDISPLAY_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_PART_NUMBER NUMERIC(38,0) = 0, 
    @sUSER_ID VARCHAR(25) = NULL 

) 
RETURNS @tbl TABLE (Region CHAR(2), 
    State_Code CHAR(2), 
    FY NUMERIC(4,0), 
    REPORT_ID NUMERIC(2,0), 
    SECTION_ID NUMERIC(2,0), 
    SUBSECTION_ID NUMERIC(2,0), 
    DISPLAY_NUMBER NUMERIC(38,0), 
    QUESTION_NUMBER NUMERIC(38,0), 
    QUESTION_PART_NUMBER NUMERIC(38,0), 
    USER_ID VARCHAR(25)) 

AS 
--RETURN 
begin 

INSERT INTO @tbl 


SELECT 
    qi.REGION, qi.STATE_CODE, qi.FY, qi.REPORT_ID, qi.SECTION_ID, qi.SUBSECTION_ID, qi.DISPLAY_NUMBER, 
    qi.QUESTION_NUMBER, qd.QUESTION_PART_NUMBER 
from 
    FY_ST_QUESTION_INFO qi 
    inner join FY_ST_QUESTION_DETAIL qd 
    on qi.FY_ST_QUESTION_INFO_TABLE_ID = qd.FY_ST_QUESTION_INFO_TABLE_ID 
where 
    qi.region= @cRegion 
    and qi.fy= @nFY 
    and qi.REPORT_ID = @nREPORT_ID 
    and qi.SECTION_ID = @nSECTION_ID 
    and qi.SUBSECTION_ID = @nSUBSECTION_ID 
    and qi.DISPLAY_NUMBER [email protected]_NUMBER 
    and (qi.REPORTER_ID = @sUSER_ID or 
      qi.DELEGATE_ID= @sUSER_ID or 
      qi.SUB_DELEGATE_ID = @sUSER_ID); 
return; 
end 

但蒂姆评论这是一个多语句表值函数,而是因为你只是做一个选择,你可以把它在行,像这样:

CREATE FUNCTION [hsip].[Question_Dtl_Table_Id] 
( 
    -- Add the parameters for the function here 
    @cRegion CHAR(2) ='00', 
    @cState_Code CHAR(2) = '00', 
    @nFY NUMERIC(4,0) = 0, 
    @nREPORT_ID NUMERIC(2,0) = 0, 
    @nSECTION_ID NUMERIC(2,0) = 0, 
    @nSUBSECTION_ID NUMERIC(2,0) = 0, 
    @nDISPLAY_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_PART_NUMBER NUMERIC(38,0) = 0, 
    @sUSER_ID VARCHAR(25) = NULL 

) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT 
    qi.REGION, qi.STATE_CODE, qi.FY, qi.REPORT_ID, qi.SECTION_ID, qi.SUBSECTION_ID, qi.DISPLAY_NUMBER, 
    qi.QUESTION_NUMBER, qd.QUESTION_PART_NUMBER 
from 
    FY_ST_QUESTION_INFO qi 
    inner join FY_ST_QUESTION_DETAIL qd 
    on qi.FY_ST_QUESTION_INFO_TABLE_ID = qd.FY_ST_QUESTION_INFO_TABLE_ID 
where 
    qi.region= @cRegion 
    and qi.fy= @nFY 
    and qi.REPORT_ID = @nREPORT_ID 
    and qi.SECTION_ID = @nSECTION_ID 
    and qi.SUBSECTION_ID = @nSUBSECTION_ID 
    and qi.DISPLAY_NUMBER [email protected]_NUMBER 
    and (qi.REPORTER_ID = @sUSER_ID or 
      qi.DELEGATE_ID= @sUSER_ID or 
      qi.SUB_DELEGATE_ID = @sUSER_ID) 
) 
GO 
0
use [HSIP] 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- 
ALTER FUNCTION [hsip].[Question_Dtl_Table_Id] 
( 

    @cRegion CHAR(2) ='00', 
    @cState_Code CHAR(2) = '00', 
    @nFY NUMERIC(4,0) = 0, 
    @nREPORT_ID NUMERIC(2,0) = 0, 
    @nSECTION_ID NUMERIC(2,0) = 0, 
    @nSUBSECTION_ID NUMERIC(2,0) = 0, 
    @nDISPLAY_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_NUMBER NUMERIC(38,0) = 0, 
    @nQUESTION_PART_NUMBER NUMERIC(38,0) = 0, 
    @sUSER_ID VARCHAR(25) = NULL 

) 
RETURNS @tbl TABLE (Region CHAR(2), 
    State_Code CHAR(2), 
    FY NUMERIC(4,0), 
    REPORT_ID NUMERIC(2,0), 
    SECTION_ID NUMERIC(2,0), 
    SUBSECTION_ID NUMERIC(2,0), 
    DISPLAY_NUMBER NUMERIC(38,0), 
    QUESTION_NUMBER NUMERIC(38,0), 
    QUESTION_PART_NUMBER NUMERIC(38,0)) 


AS 

begin 

INSERT INTO @tbl 


select * from (SELECT qi.REGION, qi.STATE_CODE, qi.FY, qi.REPORT_ID, qi.SECTION_ID, qi.SUBSECTION_ID, qi.DISPLAY_NUMBER, 
    qi.QUESTION_NUMBER, qd.QUESTION_PART_NUMBER from 
    FY_ST_QUESTION_INFO qi 
    inner join 
    FY_ST_QUESTION_DETAIL qd 
    on qi.FY_ST_QUESTION_INFO_TABLE_ID= qd.FY_ST_QUESTION_INFO_TABLE_ID 
    where qi.region= @cRegion 
    and qi.fy= @nFY 
    and qi.REPORT_ID = @nREPORT_ID 
    and qi.SECTION_ID = @nSECTION_ID 
    and qi.SUBSECTION_ID = @nSUBSECTION_ID 
    and qi.DISPLAY_NUMBER [email protected]_NUMBER 
    and (qi.REPORTER_ID = @sUSER_ID or 
    qi.DELEGATE_ID= @sUSER_ID or 
    qi.SUB_DELEGATE_ID = @sUSER_ID) 
    and qd.QUESTION_PART_NUMBER [email protected]_PART_NUMBER) as t; 

--return @tbl; 
return; 

END 

GO 
+2

在Sean的答案中找到这个查询的版本,你会好得多。他的版本是真正的Inline TVF,并且性能会更好。 –