2016-09-21 29 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,並且性能會更好。 –