1

J'ai deux fonctions SQLServer2008 définies par l'utilisateur: fn_Top et fn_Nested. Le premier, fn_Top, est structuré de la façon suivante:Fonctions imbriquées définies par l'utilisateur dans tsql. Paramètres passant par les structures INSERT-SELECT

CREATE FUNCTION [dbo].[fn_Top] 
     RETURNS @Results table (
         MyField1 nvarchar(2000), 
         MyField2 nvarchar(2000) 
         ) 
     AS  
     BEGIN 
     INSERT INTO 
        @Results 
        (
        MyField1, 
        MyField2 
        ) 
        SELECT 
         item, 
         (SELECT MyString FROM dbo.fn_Nested(x.MyCounter)) 
        FROM 
        OtherTable x 
     RETURN  
     END 

Je voudrais faire une sorte de paramètre dynamique qui passe à la deuxième fonction, fn_Nested, la lecture des valeurs du champ MyCounter numérique dans le tableau uneautretable .

Le fait est, x.MonCounter n'est pas reconnu comme une valeur valide. Tout fonctionne bien, d'un autre côté, si je mets dans fn_Nested un paramètre statique, IE dbo.fn_Nested (17).

Y a-t-il quelqu'un qui peut suggérer une solution de contournement pour résoudre ce problème? Merci d'avance.

+0

Que retourne dbo.fn_Nested()? – sr28

+0

Ou, pour être plus clair, dbo.fn_Nested une fonction scalaire ou table-évalué? – mdisibio

Répondre

0

En supposant que fn_Nested est une fonction de table, votre syntaxe est correcte (bien qu'elle puisse être simplifiée). L'erreur semble indiquer que OtherTable n'a pas de colonne nommée MyCounter ou qu'il ne s'agit pas d'un type de colonne pouvant être implicitement converti en valeur numérique. Quelle est l'erreur exacte?

Sur une note de côté, vous pouvez simplifier fn_Top en écrivant comme une fonction de table inline:

CREATE FUNCTION dbo.fn_Top() 
RETURNS TABLE 
AS 
RETURN 
( 
     SELECT x,item as MyField1, y.MyString AS MyField2 
      FROM dbo.OtherTable x 
    CROSS APPLY dbo.fn_Nested(x.MyCounter) AS y 
) 
GO 
0

La syntaxe en utilisant la deuxième fonction est décrite ici

SQL User Defined Function Within Select

create table OtherTable (
item varchar(10), 
MyCounter int 
); 

CREATE FUNCTION fn_Nested(@Id int) 
RETURNS varchar(20) 
AS 
BEGIN 
    RETURN 'testString ' + CAST(@Id AS VARCHAR(3)) 
END; 

INSERT INTO OtherTable SELECT 'item1', 1 
INSERT INTO OtherTable SELECT 'item2', 2 

SELECT item, 
dbo.fn_Nested(x.MyCounter) as MyString 
FROM OtherTable x 

Résultats:

item1 testString 1

item2 testString 2

Questions connexes