2011-04-07 4 views
0

Peut-on me dire comment envoyer le LIst d'ID à la procédure stockée en sql.Procédure stockée .. using sql server

Je dois envoyer la liste à partir de mon contrôleur afin que cette liste d'ID puisse s'exécuter à la fois en utilisant la procédure stockée.

Merci

+0

Je pense que vous pourriez avoir besoin de plus d'informations ici. Que comptez-vous faire avec ces identifiants? doivent-ils aller dans une clause where? –

+0

Oui nathan, son aller à la clause where.pour mettre à jour les identifiants perticular dans les tableaux. en utilisant ce sP. – user300485

Répondre

6

Dans SQL Server 2008 et jusqu'à vous pouvez utiliser Table-Valued Parameters

+0

également utile, voici un lien montrant comment l'appeler à partir de .net http://dotnetspeaks.com/DisplayArticle.aspx?ID=47 –

+0

@nathan gonzalez Désolé, je pensais que ce lien a eu un exemple - j'ai fait un peu de ces TVPs récemment moi-même. Ce lien a une meilleure vue d'ensemble complète: http://msdn.microsoft.com/en-us/library/bb675163.aspx –

+0

que le lien msdn a une bonne gamme d'exemples, mais le dernier concernant l'option de streaming est un peu laconique. J'ai écrit un article détaillant spécifiquement l'option de streaming ici: http://www.sqlservercentral.com/articles/SQL+Server+2008/66554/ (l'inscription est obligatoire). –

1

Qu'en est une chaîne délimitée par des virgules des id?

Le problème est serveur SQL ne prend pas en charge un type de données de tableau (ou similaire)

+0

Oui, nous pouvons envoyer une chaîne d'ID, mais comment séparer cette chaîne d'identifiants avec une virgule délimitée dans le sp. – user300485

+0

On dirait que Rene147 a ajouté un lien utile –

3

La meilleure façon (en 2008) est de le transmettre comme une table. Avant 2008, vous deviez utiliser un format CSV VarChar puis le diviser.

avoir une lecture de ceci: http://www.sommarskog.se/arrays-in-sql-2008.html

+0

Pour 2005 (et même 2000), XML est généralement le meilleur moyen que CSV. Plus propre et plus rapide, et facilement extensible à plusieurs colonnes. De l'article que vous liez à: "En fait, XML est la méthode la plus rapide qui ne nécessite aucune préparation dans le serveur: vous n'avez pas besoin d'activer le CLR et de créer une fonction, ni besoin de définir un type de table un paramètre table-évalué. " – Lucero

+0

Superbe lien ... :-) – IrishChieftain

1

On dirait que vous besoin de quelque chose le long des lignes de ce:

CREATE FUNCTION [dbo].[Split_String] 
(
    @ConcatValues VARCHAR(MAX) 
) 
RETURNS @Values Table 
(
    Value VARCHAR(MAX) 
) 
AS 
/************************************************************************************************************** 
Purpose: When called from a stored procedure and passed a character delimited parameter (of String data type values), 
      this function returns a table named "@Values" with a field named "Value" (populated with the parameter list) 
      which can then be referenced in the stored procedure. 
      This function requires that the delimited paramater have as its first character the delimiter character. 

Sample calls: 
      Select * from [dbo].[Split_String](';dog;cat;mouse') 
      Select * from [dbo].[Split_String]('| dog| cat| mouse|')   
      Select * from [dbo].[Split_String]('|')  
      Select * from [dbo].[Split_String]('')  

**************************************************************************************************************/ 

BEGIN 
    --Indexes to keep the position of searching 
    DECLARE @Delim CHAR(1) 
    Declare @Pos1 Int 
    Declare @Pos2 Int 

    --Identify delimiter character 
    SET @Delim = SUBSTRING(@ConcatValues, 1, 1) 
    --Append delimiter character 
    Set @ConcatValues = @ConcatValues + ' ' + @Delim  
    --Set 1st character of 1st value 
    Set @Pos2 = 2 

    While @Pos2 < Len(@ConcatValues) 
    BEGIN 
     Set @Pos1 = CharIndex(@Delim, @ConcatValues, @Pos2) 
     Insert @Values SELECT LTRIM(RTRIM(Substring(@ConcatValues, @Pos2, @Pos1 - @Pos2))) 
     --Go to next non-delimiter character 
     Set @Pos2 = @Pos1 + 1 
    END 
    RETURN 
END 


GO 

Notre fonction split est générique pour être utilisé dans une grande variété de situations et dépend le délimiteur étant identifié par le premier caractère de la chaîne. Il est probable qu'il pourrait être simplifié un peu si vous en avez seulement besoin en un seul endroit.