【问题标题】:How to get sp_executesql result into a variable in dynamic query?如何将 sp_executesql 结果转换为动态查询中的变量?
【发布时间】:2017-10-21 08:07:35
【问题描述】:

在下面的过程中,第二个IF 语句中的Select 语句返回结果(e_id)。

但我想将 select 语句的结果存储在一个变量中。我正在使用此变量从临时表中删除记录并在临时表中插入结果。但是@myVariable 返回 null。

CREATE TYPE TableVariable AS TABLE
(
    id INT IDENTITY(1,1),
    field_ids INT,
    value VARCHAR(MAX)
)

Type created successfully.

USE [Test]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Testing_eid]
    (@TableVar TableVariable READONLY,
     @C_id INT)
AS
    DECLARE @maxPK INT
    DECLARE @pk INT 
    DECLARE @fid SMALLINT
    DECLARE @is_List SMALLINT
    DECLARE @val VARCHAR(MAX)
    DECLARE @field_Type VARCHAR(50)
    DECLARE @Where VARCHAR(MAX)
    DECLARE @SQL NVARCHAR(2000)
    DECLARE @myVariable INT
    DECLARE @SQLSTATUS NVARCHAR(2000)

    --Declare @TempEntities table
    --(
    --entity_id int
    --)
   Set @pk = 1
BEGIN
   BEGIN TRY
    SET NOCOUNT ON;
    create table #Tempentities (e_id int)
     Select @maxPK = count(*) From @TableVar 

     While @pk <= @maxPK
    BEGIN
        SELECT @fid= field_ids FROM @TableVar where id=@pk;
        SELECT @val= value     FROM @TableVar where id=@pk;
        SELECT @field_Type=type,@is_List=is_list FROM FIELD WHERE ID=@fid


            BEGIN
            IF(@is_List = 0 AND @pk=1)
            BEGIN
            Set @SQL = 'SELECT DISTINCT v1.e_id from values v1 inner join listings l ON v1.e_id = l.e_id WHERE l.c_id = ' +CAST(@C_id AS nvarchar(20))
            SET @SQL += ' AND field_id='+CAST(@fid AS nvarchar(20))+ ' and(value IN(SELECT val FROM spliting('''+CAST(@val AS VARCHAR(2000))+''','','')))' 
            INSERT INTO #Tempentities(entity_id) EXECUTE SP_EXECUTESQL @SQL
            END
            IF(@is_List = 0 AND @pk>1)
            BEGIN
            SELECT @field_type
            SELECT * FROM #Tempentities
            Set @SQL = 'SELECT DISTINCT v1.e_id from values v1 inner join listings l ON v1.e_id = l.e_id WHERE l.catalog_id = ' +CAST(@C_id AS nvarchar(20))
            SET @SQL += ' AND field_id='+CAST(@fid AS nvarchar(20))+ ' AND(value IN(SELECT val FROM spliting('''+CAST(@val AS VARCHAR(2000))+''','',''))) AND (v1.entity_id IN(SELECT * FROM #Tempentities))' 
            --INSERT INTO @TempEntities(entity_id) EXECUTE SP_EXECUTESQL @SQL
             EXECUTE SP_EXECUTESQL @SQL, N'@myVariable INT OUTPUT', @myVariable=@myVariable OUTPUT
             --Execute @entityid=SP_EXECUTESQL @SQL
              Delete from #Tempentities
              insert into #Tempentities(entity_id) values(@myVariable)

            END
            END
             SELECT * FROM #Tempentities
     select @pk = @pk + 1
     --select @pk

    END

    END TRY
    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
    END CATCH
END

【问题讨论】:

    标签: sql sql-server tsql dynamic sp-executesql


    【解决方案1】:

    将 sp_executesql 与输出参数一起使用

    你可以参考下面的答案来解决这个问题

    sp_executesql 在您的问题中不是必需的

    如果目标是将值插入#Tempentities,则无需将值存储在变量中,您可以使用动态查询中的临时表:

    SET @SQL = 'INSERT INTO #Tempentities(entity_id) SELECT DISTINCT v1.e_id from values v1 inner join listings l ON v1.e_id = l.e_id WHERE l.catalog_id = ' +CAST(@C_id AS nvarchar(20))
    SET @SQL += ' AND field_id='+CAST(@fid AS nvarchar(20))+ ' AND(value IN(SELECT val FROM spliting('''+CAST(@val AS VARCHAR(2000))+''','',''))) AND (v1.entity_id IN(SELECT * FROM #Tempentities))' 
    

    整个查询将如下所示:

    USE [Test]
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[Testing_eid]
        (@TableVar TableVariable READONLY,
         @C_id INT)
    AS
        DECLARE @maxPK INT
        DECLARE @pk INT 
        DECLARE @fid SMALLINT
        DECLARE @is_List SMALLINT
        DECLARE @val VARCHAR(MAX)
        DECLARE @field_Type VARCHAR(50)
        DECLARE @Where VARCHAR(MAX)
        DECLARE @SQL NVARCHAR(2000)
        DECLARE @myVariable INT
        DECLARE @SQLSTATUS NVARCHAR(2000)
    
        --Declare @TempEntities table
        --(
        --entity_id int
        --)
       Set @pk = 1
    BEGIN
       BEGIN TRY
        SET NOCOUNT ON;
        create table #Tempentities (e_id int)
         Select @maxPK = count(*) From @TableVar 
    
         While @pk <= @maxPK
        BEGIN
            SELECT @fid= field_ids FROM @TableVar where id=@pk;
            SELECT @val= value     FROM @TableVar where id=@pk;
            SELECT @field_Type=type,@is_List=is_list FROM FIELD WHERE ID=@fid
    
    
                BEGIN
                IF(@is_List = 0 AND @pk=1)
                BEGIN
                Set @SQL = 'SELECT DISTINCT v1.e_id from values v1 inner join listings l ON v1.e_id = l.e_id WHERE l.c_id = ' +CAST(@C_id AS nvarchar(20))
                SET @SQL += ' AND field_id='+CAST(@fid AS nvarchar(20))+ ' and(value IN(SELECT val FROM spliting('''+CAST(@val AS VARCHAR(2000))+''','','')))' 
                INSERT INTO #Tempentities(entity_id) EXECUTE @SQL
                END
                IF(@is_List = 0 AND @pk>1)
                BEGIN
                SELECT @field_type
                SELECT * FROM #Tempentities
                Delete from #Tempentities
                Set @SQL = 'insert into #Tempentities(entity_id) SELECT DISTINCT v1.e_id from values v1 inner join listings l ON v1.e_id = l.e_id WHERE l.catalog_id = ' +CAST(@C_id AS nvarchar(20))
                SET @SQL += ' AND field_id='+CAST(@fid AS nvarchar(20))+ ' AND(value IN(SELECT val FROM spliting('''+CAST(@val AS VARCHAR(2000))+''','',''))) AND (v1.entity_id IN(SELECT * FROM #Tempentities))' 
                --INSERT INTO @TempEntities(entity_id) EXECUTE SP_EXECUTESQL @SQL
                 EXECUTE (@SQL)
    
    
    
                END
                END
                 SELECT * FROM #Tempentities
         select @pk = @pk + 1
         --select @pk
    
        END
    
        END TRY
        BEGIN CATCH
            SELECT ERROR_NUMBER() AS ErrorNumber
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage;
        END CATCH
    END
    

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 2016-11-21
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 2014-06-27
      相关资源
      最近更新 更多