【问题标题】:How to resolve An INSERT EXEC statement cannot be nested in SQL server如何解决 INSERT EXEC 语句不能嵌套在 SQL Server 中
【发布时间】:2018-03-20 13:52:49
【问题描述】:

我有一个 sp,我在其中返回一个单列结果。我正在尝试将结果存储到表类型中,但出现此错误:

INSERT EXEC 语句不能嵌套。

我用谷歌搜索,但没有找到任何可接受的解决方案。

sp如下:-

    ALTER PROCEDURE [dbo].[Sp_DemographicFilter_booster]
        (

        @FilterSelected FilterSelected READONLY, 
        @CountryCategoryId int=null
    )
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @WhereCondition varchar(500)  ;
    DECLARE @QueryString Varchar(MAX) ;
    DECLARE @QueryString_booster Varchar(MAX) ;
    DECLARE @Filter table (FilterColumn Varchar(200),FilterValue Varchar(200))
    DECLARE @Result table (SERIAL int)
    DECLARE @Result_booster table (SERIAL int)

    if( select top 1  FilterColumn FROM  @FilterSelected where FilterColumn<>'HISPANIC') is NOT NULL
    BEGIN
    Insert into @Filter
    Select * from @FilterSelected where FilterColumn<>'HISPANIC'
    --DECLARE @DemoTbl TABLE (MetricName VARCHAR(100),CatValue VARCHAR(100))

        SELECT @WhereCondition= COALESCE( @WhereCondition + ' and ', '')+SubjectList FROM (
        SELECT DISTINCT STD.Filtercolumn +' in ('+
        ISNULL(STUFF((SELECT ', '+'''' + ssm.Filtervalue+''''
        FROM @Filter SSM
        INNER JOIN @Filter SUB ON SUB.FilterColumn = SSM.FilterColumn and SUB.FilterColumn=STD.FilterColumn
        WHERE sub.FilterValue = ssm.FilterValue
        FOR XML PATH('')
        ), 1, 1, ''), 'Not Assigned Yet')+')' AS SubjectList
        FROM @Filter STD)A


        print @WhereCondition

    --INSERT INTO @DemoTbl
    --select SUBSTRING(col1,1, CHARINDEX(':',col1,1)-1) MetricName,SUBSTRING(col1, CHARINDEX(':',col1,1)+1,LEN(Col1)) CatValue  
    --from dbo.UF_CSVDataToTable(@FilterSelectedSelected)


    SET @QueryString='SELECT SERIAL FROM Logical.Demographic D
    WHERE '+@WhereCondition+' and CountryCategoryId='+cast(@CountryCategoryId as varchar(10))
    PRINT @QueryString
    insert into @Result
    EXEC(@QueryString)
    --select * from @Result
    END
     IF(select top 1  FilterColumn FROM  @FilterSelected where FilterColumn='HISPANIC') IS NOT NULL
    BEGIN

    Delete from @Filter;

    DECLARE @Response varchar(20)=null;

    Insert into @Filter
    Select * from @FilterSelected where FilterColumn='HISPANIC'

    select @Response=FilterValue from @Filter;

    DECLARE @VariableID int=null;

    select @VariableID=SurrogateKeyCounter from MetaData.Metadata_Screener where DBMetricName='HISPANIC';

    SET @QueryString_booster='SELECT SERIAL FROM Logical.Response R
    WHERE variableid='+cast(@VariableID as varchar(10))+' and CountryCategoryId='+cast(@CountryCategoryId as varchar(10))
    +' and ResponseName='''+@Response+''''

    PRINT @QueryString_booster
    Insert into @Result_booster
    EXEC(@QueryString_booster)

    END
    DECLARE @Final_Result table (SERIAL int)

    insert into @Final_Result
    select * from @Result
    UNION
    select * From @Result_booster

    select * from @Final_Result


    END

我这样调用这个过程:

declare @ds FilterSelected
insert into @ds values('Hispanic','yes')
@FilterSelected=@ds,@CountryCategoryId=100

 DECLARE @DemoTbl TABLE (Serial INT)


Insert into @DemoTbl    
EXEC Sp_DemographicFilter_booster @FilterSelected=@ds,
@CountryCategoryId=100

【问题讨论】:

  • 解决方法很简单,可能会令人不快:不要在你的外部调用中使用INSERT .. EXEC,或者不要在你的内部调用中使用INSERT .. EXEC(即重写存储的程序)。 This article 详细介绍了存储过程可以共享数据的所有方式。没有快速解决办法。
  • 谢谢 Jeroen.... 我会记住这一点的。

标签: sql-server database stored-procedures java-stored-procedures


【解决方案1】:

调用 SP Sp_DemographicFilter_booster 以及唯一 ID 。 在 Sp_DemographicFilter_booster SP 内部创建全局表 (##) 将结果存储在具有相同唯一 ID AS ID 字段的全局表中 现在,当返回主 SP 访问全局表时,具有唯一 ID 的 where 条件

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 2014-07-07
    • 2013-05-17
    • 2016-05-02
    • 2017-10-18
    • 2020-01-21
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多