2012-01-18 4 views
2

Comment retourner plusieurs valeurs (disons, un nombre et une chaîne) à partir d'une fonction définie par l'utilisateur dans SQL Server dans une requête?Requête Sql avec fonction qui renvoie 2 valeurs

par exemple select col1, dbo.function1(col2) from table

et le résultat à

Col1 |  Col2  |   Col3 
-----+-------------------+--------------------- 
x | Num from function | String from function 

Je ne veux pas appeler la fonction 2 fois parce que j'utilise un code complexe et je ne veux pas l'exécuter deux fois. Juste pour prendre les 2 résultats finaux dans le retour

Répondre

9

Extrait - http://www.sqlteam.com/article/returning-complex-data-from-user-defined-functions-with-cross-apply

De retour plusieurs valeurs à partir d'une UDF peut se faire assez facilement dans SQL Server, mais nous devons retourner ces valeurs comme une table virtuelle

--Sample Table 
CREATE TABLE emails 
(
    ID INT PRIMARY KEY, 
    EmailAddress VARCHAR(100) 
) 
GO 

--Dummy Data 
INSERT INTO emails 
SELECT 1,'[email protected]' UNION ALL 
SELECT 2,'[email protected]' UNION ALL 
SELECT 3,'[email protected]' 

--UDF Creation 
CREATE FUNCTION EmailParse (@email VARCHAR(1000)) 
RETURNS @t TABLE (UserName VARCHAR(20), Domain VARCHAR(20)) 
AS 
BEGIN 
    DECLARE @i INT 

    SELECT @i = charindex('@', @email,1); 

    IF (@i > 1) 
     INSERT INTO @t VALUES (LEFT(@email,@i-1), SUBSTRING(@email,@i+1,20)) 
    ELSE 
     INSERT INTO @t VALUES (NULL,NULL) 

    RETURN 
END 


--UDF Usage 
SELECT 
    emails.ID, s.Username, s.Domain 
FROM 
    emails 
CROSS APPLY 
EmailParse(emails.EmailAddress) s 
0

Vous ne pouvez pas créer une fonction qui renvoie deux valeurs. Quel est le problème lorsque vous appelez la fonction deux fois? J'ai trouvé un article dans TechNet qui explique comment créer un Table-Valued User-Defined Functions.

5

Je créerais probablement une table UDF. Quelque chose le long des lignes de celle-ci:

CREATE FUNCTION [owner].[function_name] 
(
     @parm1 <datatpe> = <default> 
) 
RETURNS TABLE 
AS 
     RETURN 
     (
     SELECT <column1, column2, ...> 
     FROM <table, view, etc.> 
     WHERE <some condition applies>  -- optional clauses 
) 

plus d'info here.

Cela peut sembler une sorte de gâchis si vous ne faites que renvoyer une ligne, mais je pense que vos alternatives (xml, analyser les valeurs de chaîne à la volée) rendraient les choses beaucoup plus difficiles.

+0

Merci pour votre réponse. Qu'en est-il si je veux retourner 2 variables déclarées? – John

+0

@John Y at-il un problème avec 'RETURN (SELECT @ Var1, @ Var2)'? –

Questions connexes