web-dev-qa-db-fra.com

Assigne le résultat de SQL dynamique à la variable

Je fais du SQL dynamique pour convertir toutes les colonnes d'une table en chaîne

alors après tout ce que je fais

EXEC(@template); 

où @template est la requête générée dynamique ainsi: 

col1  col2 col3
---------------
1    7    13 
2    8    14
3    9    15
4   10    16
5   11    17
6   12    18

(résultats: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)

Comment assigner à une variable la chaîne résultante

quelque chose comme?

DECLARE  @result AS varchar(max);
 SET @result = EXEC(@template); 
39
cMinor

Vous pouvez utiliser sp_executesql avec le paramètre de sortie.

declare @S nvarchar(max) = 'select @x = 1'

declare @xx int
set @xx = 0

exec sp_executesql @S, N'@x int out', @xx out

select @xx

Résultat:

(No column name)
1

Modifier

Dans mon exemple, @S est à la place de votre @template. Comme vous pouvez le voir, j'attribue une valeur à @x. Vous devez donc modifier @template pour affecter en interne la chaîne séparée par des virgules à la variable que vous définissez dans votre deuxième argument à sp_executesql. Dans mon exemple N'@x int out'. Vous voulez probablement un paramètre de sortie varchar(max). Quelque chose comme N'@Result varchar(max) out'

Voici un autre exemple de construction d'une chaîne séparée par des virgules de master..spt_values

declare @template nvarchar(max)
set @template = 
'select @Result += cast(number as varchar(10))+'',''
from master..spt_values
where type = ''P''
'

declare @CommaString varchar(max)
set @CommaString = ''

exec sp_executesql @template, N'@Result varchar(max) out', @CommaString out

select @CommaString
56
Mikael Eriksson

La plupart de ces réponses utilisent sp_executesql comme solution à ce problème. J'ai constaté qu'il y avait quelques limitations à l'utilisation de sp_executesql, sur lesquelles je n'entrerai pas, mais je voulais proposer une alternative en utilisant EXEC () . J'utilise SQL Server 2008 et je sais que certains des objets que j'utilise dans ce script ne sont pas disponibles dans les versions précédentes de SQL Server. Soyez donc prudent.

DECLARE @CountResults TABLE (CountReturned INT)
DECLARE 
    @SqlStatement VARCHAR(8000) = 'SELECT COUNT(*) FROM table'
    , @Count INT

INSERT @CountResults
EXEC(@SqlStatement)

SET @Count = (SELECT CountReturned FROM @CountResults)
SELECT @Count
11
Adam

Vous pouvez utiliser sp_executesql au lieu de exec. Cela vous permet de spécifier un paramètre de sortie.

declare @out_var varchar(max);
execute sp_executesql 
    N'select @out_var = ''hello world''', 
    N'@out_var varchar(max) OUTPUT', 
    @out_var = @out_var output;
select @out_var;

Ceci imprime "bonjour le monde".

11
Andomar

Exemple pour exécuter une chaîne SQL dans la procédure stockée:

(J'utilise ceci pour comparer le nombre d'entrées sur chaque table lors de la première vérification d'un test de régression, dans une boucle de curseur)

select @SqlQuery1 = N'select @CountResult1 = (select isnull(count(*),0) from ' + @DatabaseFirst+'.dbo.'+@ObjectName + ')'

execute sp_executesql    @SqlQuery1 , N'@CountResult1 int OUTPUT',     @CountResult1 = @CountResult1 output;
1
Chris Maakal

Vous devriez essayer ceci en obtenant la valeur SEQUENCE dans une variable du tableau dynamique. 

DECLARE @temp table (#temp varchar (MAX));
DECLARE @SeqID nvarchar(150);
DECLARE @Name varchar(150); 

SET @Name = (Select Name from table)
SET @SeqID = 'SELECT NEXT VALUE FOR '+ @Name + '_Sequence'
insert @temp exec (@SeqID)

SET @SeqID = (select * from @temp )
PRINT @SeqID

Résultat:

(1 row(s) affected)
 1
0
Disha Sojitra