Comment passer chaque valeur de la colonne d'une table à une procédure stockée et save le résultat dans une table dans SQL Server

J'ai une table avec le champ de nom d'user comme indiqué ci-dessous. J'ai une procédure stockée qui reçoit l'argument username et le process pour montrer les résultats. Pour l'instant, je suis en train d'exécuter manuellement la procédure stockée pour chaque nom d'user en spécifiant l'argument et après l'exécution copyr coller son résultat dans Excel. La table avec le nom d'user est:

╔════╦══════════╦══╗ ║ ID ║ Username ║ ║ ╠════╬══════════╬══╣ ║ 1 ║ abc ║ ║ ║ 2 ║ def ║ ║ ║ 3 ║ ghi ║ ║ ║ 4 ║ jkl ║ ║ ║ 5 ║ mno ║ ║ ║ 6 ║ xyz ║ ║ ╚════╩══════════╩══╝ 

La procédure stockée est:

 spCalculateSomeValuesForThePassedUsername 'abc' 

Sa sortie de la procédure stockée est:

 ╔════╦══════════╦═══════╗ ║ ID ║ Username ║ Value ║ ╠════╬══════════╬═══════╣ ║ 1 ║ abc ║ 100 ║ ╚════╩══════════╩═══════╝ 

Je peux faire une procédure stockée parent qui contient toute la procédure stockée et l'exécuter pour get les résultats mais je devrai toujours copyr coller les résultats. Par exemple

 CREATE PROCEDURE SPparent AS BEGIN spCalculateSomeValuesForThePassedUsername 'abc' spCalculateSomeValuesForThePassedUsername 'def' spCalculateSomeValuesForThePassedUsername 'ghi' spCalculateSomeValuesForThePassedUsername 'jkl' . . . END 

Je me request s'il sera possible d'get le nom d'user et de coller la sortie à une table de résultats automatiquement.

Le tableau des résultats souhaité

 ╔════╦══════════╦═══════╗ ║ ID ║ Username ║ Value ║ ╠════╬══════════╬═══════╣ ║ 1 ║ abc ║ 100 ║ ║ 2 ║ def ║ 200 ║ ║ 3 ║ ghi ║ 150 ║ ║ 4 ║ jkl ║ 300 ║ ║ 5 ║ mno ║ 700 ║ ║ 6 ║ xyz ║ 1000 ║ ╚════╩══════════╩═══════╝ 

Et voici une solution orientée set beaucoup plus courte qui n'utilise pas de loops ou de sliders:

 CREATE TABLE #Results(ID INT, Username SYSNAME, Value INT); DECLARE @sql AS NVARCHAR(MAX) = N''; SELECT @sql = @sql + N' INSERT #Results EXEC spCalculateSomeValuesForThePassedUsername N'''+Username+''';' FROM <yourTable>; EXEC(@sql); Select * from #Results; 

Une façon de le faire serait quelque chose comme ça –

 CREATE PROCEDURE SPparent AS BEGIN DECLARE @id INT, @UserName VARCHAR(100) DECLARE @TempTable TABLE (id INT,UserName VARCHAR(100),Value INT) DECLARE sample_cursor CURSOR FOR SELECT ID,UserName FROM <yourtable> OPEN sample_cursor FETCH NEXT FROM sample_cursor INTO @id, @UserName WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO @TempTable Exec spCalculateSomeValuesForThePassedUsername @UserName FETCH NEXT FROM sample_cursor INTO @id, @UserName END CLOSE sample_cursor SELECT id,UserName,Value FROM @TempTable END 

Donc, ici, vous parcourez les loggings initiaux à partir de votre table et appelez sp spCalculateSomeValuesForThePassedUsername pour tous les UserName et les stocker dans une table temporaire. Une fois cela fait, il suffit de sélectionner la table temporaire pour get tous les loggings dans un format de table.

 Declare @UserName NVarChar(128); Create Table #Results(Id Int, UserName NVarChar(128), Value Int); Declare curSO Cursor Local Fast_Forward Read_Only For Select UserName From mySchema.myTable ; Open curSO; Fetch Next From curSO Into @UserName; While @@Fetch_Status = 0 Begin Insert Into #Results Exec spCalculateSomeValuesForThePassedUsername @UserName; Fetch Next From curSO Into @UserName; End Close curSO; Deallocate curSO; -- Or do something different here. I used a temporary table. You can use whatever Select * From #Results 

Une autre solution utilise une boucle while comme celle-ci.

 DECLARE @id INT, @UserName VARCHAR(100) SELECT TOP (1) @id = id ,@UserName = UserName FROM myTable; WHILE @@rowcount > 0 BEGIN EXEC sp_executesql N'Exec spCalculateSomeValuesForThePassedUsername @UserName;' ,N'@UserName VARCHAR(100)' ,@UserName = @UserName; SELECT TOP (1) @id = id ,@UserName = UserName FROM myTable WHERE id > @id; END; 
 SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO CREATE PROCEDURE spCalculateSomeValuesForThePassedUsername AS RETURN GO ALTER PROCEDURE spCalculateSomeValuesForThePassedUsername ( @Username varchar(255) ) AS SELECT @Username, 0 GO CREATE PROCEDURE spParent AS RETURN GO ALTER PROCEDURE spParent AS BEGIN SET NOCOUNT ON DECLARE @t AS table (id int IDENTITY(1,1), Username varchar(255), Value int) DECLARE @num int = 0 DECLARE @Username varchar(255) DECLARE @ret int = 1 -- DROP TABLE #Users CREATE TABLE #Users ( id int IDENTITY(1,1) NOT NULL PRIMARY KEY, Username varchar(255) NOT NULL ) INSERT INTO #Users (Username) SELECT UserName FROM (VALUES ('abc'), ('def'), ('ghi')) AS t (UserName) WHILE @ret > 0 BEGIN IF @UserName IS NOT NULL INSERT INTO @t (Username, Value) EXEC sp_executesql N'Exec spCalculateSomeValuesForThePassedUsername @Username;', '@Username varchar(255)', @Username = @Username; SELECT TOP(1) @Username = UserName, @num = id FROM #Users WHERE id > @num ORDER BY id ASC SET @ret = @@ROWCOUNT END SELECT * FROM @t END GO EXEC spParent GO DROP PROCEDURE spParent GO DROP PROCEDURE spCalculateSomeValuesForThePassedUsername GO SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON GO