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);
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
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
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".
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;
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