Sql 操作\u DTL\u表\u ID和 列号您可能有一些不匹配的开始/结束。我会对代码进行一致的格式化,以便您能够识别这一点。另外,您已经说过您会遇到错误,但不是哪些错误。一般来说,您可能能够分离一些语句并独立测试它们。我认为您需要处理“开始”和“结束”逻辑。

Sql 操作\u DTL\u表\u ID和 列号您可能有一些不匹配的开始/结束。我会对代码进行一致的格式化,以便您能够识别这一点。另外,您已经说过您会遇到错误,但不是哪些错误。一般来说,您可能能够分离一些语句并独立测试它们。我认为您需要处理“开始”和“结束”逻辑。,sql,sql-server,Sql,Sql Server,操作\u DTL\u表\u ID和 列号您可能有一些不匹配的开始/结束。我会对代码进行一致的格式化,以便您能够识别这一点。另外,您已经说过您会遇到错误,但不是哪些错误。一般来说,您可能能够分离一些语句并独立测试它们。我认为您需要处理“开始”和“结束”逻辑。当您有一个条件语句时,它需要紧接着一个Begin命令。如果没有,它只执行紧跟在条件语句后面的一行。“是的,您的开始和结束不正确。您需要取消注释注释,并在第一个If之后直接添加一个开始。然后围绕if(@nISMerge='Y')开始和结束。但是你

操作\u DTL\u表\u ID和
列号您可能有一些不匹配的开始/结束。我会对代码进行一致的格式化,以便您能够识别这一点。另外,您已经说过您会遇到错误,但不是哪些错误。一般来说,您可能能够分离一些语句并独立测试它们。我认为您需要处理“开始”和“结束”逻辑。当您有一个条件语句时,它需要紧接着一个Begin命令。如果没有,它只执行紧跟在条件语句后面的一行。“是的,您的开始和结束不正确。您需要取消注释注释,并在第一个If之后直接添加一个开始。然后围绕if(@nISMerge='Y')开始和结束。但是你想用这个sp做什么?您正在选择一个结果集,然后执行以下操作之一,选择第二个结果集,该结果集将是没有列别名的单行标量值,从表中删除行,或插入行并从另一个表中删除其他行。这看起来很奇怪,但我不知道您的业务案例,所以一切可能都很好。还需要在delete语句中去掉表别名,或者将它们添加到from前面,以及从asdfsf ad中删除ad。并声明您正在使用的所有变量和更多混乱…最终修复了所有错误,查询运行正常。谢谢大家!!
CREATE PROCEDURE [hsip].[MDT] 
(
@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,
@nIsMerge char ='N'
)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @starting_row_index as integer=0,
            @ncolumn_index as integer=0,
            @sresponse_string as varchar(4000),
            @srepsonse_stringm as varchar(4000),
            @response_stringo as varchar(4000),
            @nFY_ST_QUESTION_DTL_TABLE_ID as numeric(38,0),


  select qd.FY_ST_QUESTION_DTL_TABLE_ID
from FY_ST_QUESTION_DETAIL qd inner join FY_ST_QUESTION_INFO qi
on qd.FY_ST_QUESTION_INFO_TABLE_ID =  qi.FY_ST_QUESTION_INFO_TABLE_ID
       where qi.region = @cRegion
         and qi.state_code = @cState_Code
         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.QUESTION_NUMBER = @nQUESTION_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 = @nQUESTION_PART_NUMBER;

         set @ncolumn_index=
         case
         when (@nREPORT_ID = 1 and @nQUESTION_NUMBER = 21) then  17
            when (@nREPORT_ID = 1 and @nQUESTION_NUMBER = 32) then  16
            when (@nREPORT_ID = 3 and @nQUESTION_NUMBER = 11) then  15
            when (@nREPORT_ID = 3 and @nQUESTION_NUMBER = 12) then  27
        end;

if(@nFY_ST_QUESTION_DTL_TABLE_ID >0)

        if(@nIsMerge = 'Y')

        select (max(ad.ROW_NUMBER)) 
        from FY_ST_ANSWER_DETAIL as ad
        where ad.FY_ST_QUESTION_DTL_TABLE_ID=@nFY_ST_QUESTION_DTL_TABLE_ID;

        else

        --begin

        delete from FY_ST_ANSWER_DETAIL ad
        where ad.fy_st_question_dtl_table_id = @nFY_ST_QUESTION_DTL_TABLE_ID;

        end;

        INSERT INTO FY_ST_ANSWER_DETAIL AD
            SELECT UL.FY_ST_QUESTION_DTL_TABLE_ID,UL.REGION,UL.STATE_CODE,UL.FY,
                   UL.REPORT_ID,UL.SECTION_ID,UL.SUBSECTION_ID,
                   UL.DISPLAY_NUMBER,UL.QUESTION_NUMBER,UL.QUESTION_PART_NUMBER,
                   UL.ROW_NUMBER+@starting_row_index,
                   UL.COLUMN_NUMBER,
                   UL.LAST_UPDATE_USERID,UL.LAST_UPDATE_TIME,
                   UL.RESPONSE_STRING
              FROM UPLOAD_TEMP_DATA UL
             WHERE UL.FY_ST_QUESTION_DTL_TABLE_ID = @nFY_ST_QUESTION_DTL_TABLE_ID
               and UL.COLUMN_NUMBER <= @ncolumn_index;

               DELETE FROM UPLOAD_TEMP_DATA UL
              WHERE UL.FY_ST_QUESTION_DTL_TABLE_ID = @nFY_ST_QUESTION_DTL_TABLE_ID;

--end;


END
GO
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @starting_row_index as integer=0,
            @ncolumn_index as integer=0,
            @sresponse_string as varchar(4000),
            @srepsonse_stringm as varchar(4000),
            @response_stringo as varchar(4000),
            @nFY_ST_QUESTION_DTL_TABLE_ID as numeric(38,0);


  select qd.FY_ST_QUESTION_DTL_TABLE_ID
from FY_ST_QUESTION_DETAIL qd inner join FY_ST_QUESTION_INFO qi
on qd.FY_ST_QUESTION_INFO_TABLE_ID =  qi.FY_ST_QUESTION_INFO_TABLE_ID
       where qi.region = @cRegion
         and qi.state_code = @cState_Code
         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.QUESTION_NUMBER = @nQUESTION_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 = @nQUESTION_PART_NUMBER;

         set @ncolumn_index=
         case
         when (@nREPORT_ID = 1 and @nQUESTION_NUMBER = 21) then  17
            when (@nREPORT_ID = 1 and @nQUESTION_NUMBER = 32) then  16
            when (@nREPORT_ID = 3 and @nQUESTION_NUMBER = 11) then  15
            when (@nREPORT_ID = 3 and @nQUESTION_NUMBER = 12) then  27
        end;


if(@nFY_ST_QUESTION_DTL_TABLE_ID >0)
begin
if( @nIsMerge = 'Y')
 Begin
    select (max(ad.ROW_NUMBER)) 
    from FY_ST_ANSWER_DETAIL as ad
    where ad.FY_ST_QUESTION_DTL_TABLE_ID=@nFY_ST_QUESTION_DTL_TABLE_ID;

 end
else
begin

    delete ad from FY_ST_ANSWER_DETAIL ad
    where ad.fy_st_question_dtl_table_id = @nFY_ST_QUESTION_DTL_TABLE_ID;
end

-- --if(@nFY_ST_QUESTION_DTL_TABLE_ID >0)
-- --begin

insert into FY_ST_ANSWER_DETAIL (FY_ST_QUESTION_DTL_TABLE_ID, REGION, STATE_CODE, FY, REPORT_ID, SECTION_ID, SUBSECTION_ID,
 DISPLAY_NUMBER, QUESTION_NUMBER, QUESTION_PART_NUMBER, row_number, COLUMN_NUMBER, LAST_UPDATE_USERID, LAST_UPDATE_TIME, RESPONSE_STRING)

select FY_ST_QUESTION_DTL_TABLE_ID, REGION, STATE_CODE, FY, REPORT_ID, SECTION_ID, SUBSECTION_ID, DISPLAY_NUMBER, QUESTION_NUMBER, QUESTION_PART_NUMBER, row_number, COLUMN_NUMBER, LAST_UPDATE_USERID, LAST_UPDATE_TIME, RESPONSE_STRING

 from upload_temp_data 

 where FY_ST_QUESTION_DTL_TABLE_ID = @nFY_ST_QUESTION_DTL_TABLE_ID and 
 COLUMN_NUMBER <= @ncolumn_index;
end

else
begin
DELETE ul FROM UPLOAD_TEMP_DATA UL
WHERE UL.FY_ST_QUESTION_DTL_TABLE_ID = @nFY_ST_QUESTION_DTL_TABLE_ID;
end