0

Je fonction SQL qui prend comme paramètre BIGINT comme ci-dessous:Exécuter fonction avec plusieurs valeurs dans un seul paramètre

FUNCTION [dbo].[fn_doc] 
(
    @DocID   bigint   
) 

Je veux passer plusieurs ID doc et que vous souhaitez obtenir des résultats. Pour que je fais comme ceci:

declare @DocID bigint 
SET @DocID = (2949146,2949148,2949149,14016926,14025278,14016928,14016928,14025280,14025280) 
select * from [fn_doc] (@DocID) 

Ma question est, comment exécuter une fonction avec plusieurs valeurs à un seul paramètre dans ce cas?

+0

Recherche ** T ** able ** V ** alued ** P ** aramètres en ligne. –

+0

Un exemple de lien s'il vous plaît, pour ce scénario particulier? – AskMe

+0

Tous les scénarios sont les mêmes tbh. Si vous devez transmettre une liste de valeurs en tant que paramètre à une fonction ou un SP, utilisez un point TVP. C'est le conseil général. Beaucoup de choses à trouver en ligne si vous recherchez «sql server table parameter parameter». GL! –

Répondre

0

Cela ne peut pas fonctionner

declare @DocID bigint 
SET @DocID = (2949146,2949148,2949149,14016926,14025278,14016928,14016928,14025280,14025280) 

Une variable déclarée comme BIGINT peut transporter rien d'autre qu'un grand nombre ...

Ce que vous essayez de passer est une chaîne delimitted virgule qui représente un liste des numéros.

Il n'y a pas de fonctionnalité intégrée pour cela. Neiter la clause IN, ni aucune sorte de JOIN le fera nativement.

Vous avez plusieurs choix

  • Dynamic SQL pour créer une instruction select en tant que chaîne et utilisez EXEC pour obtenir le résultat (quelque chose comme WHERE docid IN(100,200,300))
  • Créer une table (variable, température ou classique) , remplissez-le avec vos valeurs et utilisez IN ou JOIN dans votre fonction (Cela aura des problèmes avec des actions parallèles!)
  • Créer un TYPE pour déposer dans la liste comme une table
  • Utilisez une opération de fractionnement pour obtenir une table dérivée. Pour cette option, vous pouvez lire this answer (section "dynamic IN")

Voici un post with list of approaches

0

rapide et sale, mais devrait fonctionner :-) c'est un exemple pour la dernière suggestion de Shnugo

CREATE FUNCTION [dbo].[fn_doc] (@DocID as bigint) 
RETURNS bigint 
AS 
BEGIN 
    RETURN @DocID 
END 

/* your function parameter is a comma seperated list */ 
DECLARE @Parameter VARCHAR(200) 
SET @Parameter = '2949146,2949148,2949149,14016926,14025278,14016928,14016928,14025280,14025280' 

/* start and end current parameter */ 
DECLARE @start int, @end int 
SET @start = 0 
SET @end = 1 

/* current parameter */ 
DECLARE @p NVARCHAR(200) 

WHILE @end > 0 
BEGIN 
    SET @end = CHARINDEX(',', @Parameter, @start) 
    IF @start < @end 
     IF ISNUMERIC(SUBSTRING(@Parameter, @start, @[email protected])) = 1 
      SET @p = SUBSTRING(@Parameter, @start, @[email protected]) 
      PRINT [dbo].[fn_doc] (@p) 
    SET @start = @end +1 
END 
+1

Cela pourrait être * sale * mais - à coup sûr! - Ce n'est pas * rapide *. – Shnugo

0

Apparantly vous êtes toujours pas encore sorti des bois. Je vais donc vous laisser un exemple.


Créer le type TABLE:

CREATE TYPE dbo.document_ids AS TABLE (
    document_id BIGINT 
); 
GO 

Si vous ne pouvez garantir que seuls document_id distinctes valeurs seront transmises en tant que paramètre, vous pouvez bénéficier de la définition d'une clé primaire sur le terrain document_id:

CREATE TYPE dbo.document_ids AS TABLE (
    document_id BIGINT PRIMARY KEY 
); 
GO 

Créer des fonctions dépendantes ce type TABLE, une valeur scalaire et une valeur table:

CREATE FUNCTION dbo.fn_doc_sv (
    @doc_ids dbo.document_ids READONLY 
) 
RETURNS BIGINT 
AS 
BEGIN 
    RETURN (SELECT SUM(document_id) FROM @doc_ids); 
END 
GO 

CREATE FUNCTION dbo.fn_doc_tv (
    @doc_ids dbo.document_ids READONLY 
) 
RETURNS TABLE 
AS 
    RETURN (SELECT document_id FROM @doc_ids); 
GO 

Utilisation des deux fonctions:

DECLARE @doc_ids dbo.document_ids; 
INSERT INTO @doc_ids(document_id)VALUES(2949146),(2949148),(2949149),(14016926),(14025278),(14016928),(14016928),(14025280),(14025280); 

SELECT dbo.fn_doc_sv(@doc_ids); 

SELECT * FROM dbo.fn_doc_tv(@doc_ids); 

espoir qui le rend clair pour vous.