2017-05-21 1 views
2

Dans la procédure ci-dessous, l'instruction Select dans la deuxième instruction F I renvoie les résultats (e_id). Mais je veux stocker les résultats de l'instruction select dans une seule variable. Je supprime les enregistrements de la table temporaire et j'insère les résultats dans la table temporaire en utilisant cette variable. Mais @myVariable renvoie null.Comment obtenir le résultat sp_executesql dans une variable dans une requête dynamique?

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 [email protected]; 
     SELECT @val= value  FROM @TableVar where [email protected]; 
     SELECT @field_Type=type,@is_List=is_list FROM FIELD WHERE [email protected] 


      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', @[email protected] 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 

Répondre

1

sp_executesql avec le paramètre de sortie

Vous pouvez consulter les réponses suivantes pour résoudre ce problème

sp_executesql n'est pas nécessaire dans votre numéro

Si l'objectif est d'insérer des valeurs dans #Tempentities, il n'y a pas besoin de stocker des valeurs dans une variable, vous pouvez utiliser la table temporaire dans la requête dynamique:

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))' 

La volonté toute requête ressemble à:

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 [email protected]; 
     SELECT @val= value  FROM @TableVar where [email protected]; 
     SELECT @field_Type=type,@is_List=is_list FROM FIELD WHERE [email protected] 


      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