2017-07-31 1 views
0

J'utilise SQL Server 2016. Je souhaite écrire une fonction qui prend une table en paramètre et effectue ensuite une jointure sur cette table avec une autre table. J'ai déclaré le type:Fonction table prenant la table en paramètre et effectuant la jointure

CREATE TYPE WorklistTable AS TABLE (WorklistId int NOT NULL) 

Puis-je utiliser dans beaucoup de fonctions qui ne sélectionne en fonction de certaines conditions

CREATE FUNCTION [dbo].[fnGetSomeData] (
@WorklistIds WorklistTable readonly 
) 
RETURNS TABLE 
    AS RETURN 
    ( 
    select WorklistId, wlu.UserId 
    from @WorklistIds 
    join [dbo].[WorklistUser] wlu on wlu.WorklistId = @WorklistIds.worklistId 
    -- the rest is omitted 
); 

Je reçois l'erreur suivante:

Must declare the scalar variable "@WorklistIds".

J'ai essayé de déclarer la variable, mais je suis une erreur:

The variable name '@WorklistIds' has already been declared. Variable names must be unique within a query batch or stored procedure.

Répondre

4

Vous devez utiliser des alias lorsque vous joignez une variable de table.

CREATE FUNCTION [dbo].[fnGetSomeData] (
@WorklistIds WorklistTable readonly 
) 
RETURNS TABLE 
    AS RETURN 
    ( 
    select WorklistId, wlu.UserId 
    from @WorklistIds t 
    join [dbo].[WorklistUser] wlu on wlu.WorklistId = t.worklistId 
    -- the rest is omitted 
); 
+0

Merci. Travaillé comme un charme. Je vais accepter votre réponse. – Dido

2

Vous ne pouvez pas utiliser directement le nom @Table lors du référencement d'une colonne dans une variable de table. Vous devez soit un alias de la table ou l'envelopper entre crochets:

select WorklistId, wlu.UserId 
from @WorklistIds As W 
join [dbo].[WorklistUser] wlu on wlu.WorklistId = W.worklistId 

Ou

select WorklistId, wlu.UserId 
from @WorklistIds 
join [dbo].[WorklistUser] wlu on wlu.WorklistId = [@WorklistIds].worklistId