web-dev-qa-db-fra.com

SELECT sur procédure stockée SQL Server

SELECT Val from storedp_Value dans l'éditeur de requête de SQL Server Management Studio, est-ce possible?

METTRE À JOUR

J'ai essayé de créer une table temporaire mais cela n'a pas semblé fonctionner, c'est pourquoi j'ai posé la question ici.

CREATE TABLE #Result
(
batchno_seq_no int
)
INSERT #Result EXEC storedp_UPDATEBATCH
SELECT * from #Result
DROP TABLE #Result
RETURN

Procédure stockée UpdateBatch

delete from batchno_seq;
insert into batchno_seq default values;
select @batchno_seq= batchno_seq_no from batchno_seq
RETURN @batchno_seq

Qu'est-ce que je fais mal et comment l'appeler depuis la fenêtre de requête?

MISE À JOUR # 2

Ok, je vous serais reconnaissant de l’aide sur ce sujet, direction ou quoi que ce soit - c’est ce que j’essaie de réaliser.

 select batchno_seq from (delete from batchno_seq;insert into batchno_seq default values;
 select *  from batchno_seq) BATCHNO 
 INTO TEMP_DW_EKSTICKER_CLASSIC

Cela fait partie d'une déclaration select plus grande. Toute aide serait très appréciée. Essentiellement, ce SQL est rompu lors de la migration pour Oracle.

9
Nathan

Et bien non. Pour sélectionner une procédure stockée, vous pouvez effectuer les opérations suivantes:

declare @t table (
    -- columns that are returned here
);

insert into @t(<column list here>)
    exec('storedp_Value');

Si vous utilisez les résultats d'une procédure stockée de cette manière et vous avez écrit la procédure stockée, envisagez sérieusement de modifier le code pour qu'il soit une vue ou une fonction définie par l'utilisateur. Dans de nombreux cas, vous pouvez remplacer ce code par une construction plus simple et mieux adaptée.

13
Gordon Linoff

Ceci n’est pas possible sur le serveur SQL, vous pouvez insérer les résultats dans une table temporaire, puis interroger

CREATE TABLE #temp ( /* columns */ )

INSERT INTO #temp ( /* columns */ )
EXEC sp_MyStoredProc

SELECT * FROM #temp
WHERE 1=1

DROP TABLE #temp

Ou vous pouvez utiliser OPENQUERY mais cela nécessite la configuration d’un serveur lié, le SQL est

SELECT * FROM (ThisServer, 'Database.Schema.ProcedureName <params>')
5
T I

Le meilleur article (à mon avis) sur toutes les méthodes possibles pour partager des données entre procédures stockées dans SQL Server est disponible ici: http://www.sommarskog.se/share_data.html

1
Konstantin Taranov

Essaye ça

Changer 'Retour'

delete from batchno_seq;   
insert into batchno_seq default values;
select @batchno_seq= batchno_seq_no from batchno_seq
RETURN @batchno_seq

pour sélectionner'

delete from batchno_seq;   
insert into batchno_seq default values;
select @batchno_seq= batchno_seq_no from batchno_seq
SELECT @batchno_seq
0
tsohtan

J'ai dû louper quelque chose.

Étant donné que votre procédure stockée ne renvoie pas de jeu de résultats et renvoie un entier, à l'aide de la fonctionnalité RETURN des processus stockés, vous NE POUVEZ PAS INSÉRER dans AUCUNE table (car aucun jeu de résultats ne revient, du tout).

MAIS, vous pouvez (en supposant que cela se fasse de manière itérative, et non sur un ensemble) simplement stocker la valeur de retour dans une variable locale et insérer la valeur de cette variable dans la table nécessaire.

Toutefois, si vous souhaitez simplement renvoyer la valeur dans les résultats d'une fenêtre de requête dans SSMS, effectuer les actions INSERT et SELECTING est excessif . Il me semble que CE suffirait (dans une fenêtre de requête):

DECLARE @RetVal INT = 0;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
EXEC @RetVal = storedp_UPDATEBATCH;
COMMIT TRANSACTION;
SELECT @RetVal;
  --OR
  --PRINT @RetVal;

Si c'est loin de la base, veuillez fournir le DDL pour "batchno_seq", peut-être que je pourrais être d'une meilleure aide de cette façon.

À votre santé!

0
Steve Rowland

Mon approche 

select * into new_table  from (select t1.col1,t1.col2,..
from table1 t1 
union 
select t2.cola,t2.colb,..
from table2 t2) as union_table
0
user3588999