2010-11-09 4 views
3

Quelle est la meilleure façon de faire l'équivalent d'exécuter scalaire dans T-SQL? En d'autres termes, en utilisant SQL, comment puis-je obtenir la première colonne de la première ligne du premier jeu de résultats lorsque j'appelle une procédure stockée?Exécuter scalaire dans T-SQL

Edit: Juste pour clarifier les choses, c'est seulement en utilisant SQL, aucun langage côté client. Le jeu de résultats pourrait être quelque chose comme:

Id Description 
-------------- 
1 foo 
2 bar 

Je veux seulement "1" dans une variable.

La seule façon que je sais comment faire est avec une table temporaire (non testé, mais vous voyez l'idée):

INSERT #TempTable EXEC MyStoredProcedure 

DECLARE @id INT; 

SELECT TOP(1) @id = Id FROM #TempTable 
+0

+1 J'ai appris quelque chose de nouveau à cause de votre question! =) –

Répondre

0

si vous parlez client .net, vous pouvez utiliser SQLCommand .ExecuteScalar.

si non, veuillez ajouter un exemple de comment cela ressemblerait exactement à votre cas.

EDIT: vous pouvez le faire depuis que vous avez fourni info:

-- add 'loopback' linkedserver 
if exists (select * from master..sysservers where srvname = 'loopback') 
exec sp_dropserver 'loopback' 
go 
exec sp_addlinkedserver @server = N'loopback', 
@srvproduct = N'', 
@provider = N'SQLOLEDB', 
@datasrc = @@servername 
go 

select top 1 * @id = id 
from openquery(loopback, 'exec MyStoredProcedure') 
go 

Toutefois, elle est loin d'être idéal, plus vous devez activer les requêtes ad hoc pour que cela fonctionne

+0

Vraiment un hack que je n'utiliserai pas, mais cela prouve que beaucoup de limitations peuvent être surmontées avec plus d'indirection. :) –

0

C'est la seul moyen que je puisse penser, à partir de ce que vous demandez. =)

sélectionnez TOP 1 nameOfFirstColumnReturnedBySP comme Column1 de dbo.MyStoredProcedure

EDIT # 1

-- Assuming this temporary table represents the data structure returned by the SP. 
CREATE TABLE @Data (
    Column1 int 
    , Column2 nvarchar(10) 
) 

insert into @Data 
    exec dbo.MyStoredProcudure 

select TOP 1 Column1 
    from @Data 

Lien connexe: Stored Procedures: Returning Data

J'espère que cela aide! =)

+0

vous ne pouvez pas faire cela dans le serveur SQL. vous ne pouvez pas faire un choix à partir d'une procédure stockée comme ça. –

+0

@Mladen Prajdic: Vous avez raison! J'aurais pu jurer que je l'ai déjà vu quelque part. Merci pour votre commentaire, cela a amené à chercher plus loin et à trouver une issue. –

+0

bien TBH il existe une solution de contournement en ajoutant un serveur de bouclage au serveur itselft et en exécutant openquery avec exec sproc dessus –

1

Votre solution de table temporaire est probablement la seule option.

SQL n'est pas vraiment conçu pour cela