2012-05-14 4 views
1

Nous avons une fonction qui transforme une liste séparée dans une table:Comment sélectionner chaque ligne dans une variable dans SQL Server

select * from dbo.fn_rpt_ParseValues('abc|123|test','|') 

Résultats:

abc 
123 
test 

Comment puis-je obtenir chaque ligne dans une variable SQL? Par exemple:

@Name = 'abc' 
@Phone = '123' 
@Comment = 'test' 

Merci!

+1

Très inefficacement ... Vous devriez repenser votre méthode. Il sera plus efficace de simplement les placer dans des variables de la chaîne délimitée que je suspecte. – JNK

+4

Pourquoi essayez-vous de les inclure dans des variables? Tu ne penses pas faire quelque chose avec eux en boucle? Si c'est le cas, l'analyse de la liste sur une table et l'exécution d'opérations basées sur des ensembles seraient plus rapides. – Bridge

+0

La procédure stockée renvoie les lignes à une grille de données .NET. Il y a d'autres colonnes qui sont normales, mais l'une est délimitée par un tuyau, mais je dois les retourner en tant que colonnes individuelles. – user390480

Répondre

5
declare @S varchar(100) = 'abc|123|test' 

declare @Name varchar(10) 
declare @Phone varchar(10) 
declare @Comment varchar(10) 

select @Name = X.value('x[1]', 'varchar(10)'), 
     @Phone = X.value('x[2]', 'varchar(10)'), 
     @Comment = X.value('x[3]', 'varchar(10)') 
from (select cast('<x>'+replace(@S, '|', '</x><x>')+'</x>' as xml)) as T(X) 

select @Name, @Phone, @Comment 
0
DECLARE @Split table(
    RowIndex int IDENTITY(1,1) 
    ,Item varchar(200)); 
INSERT INTO @Split 
    SELECT * from dbo.fn_rpt_ParseValues('abc|123|test','|'); 

DECLARE @Name varchar(50); 
DECLARE @Phone varchar(50); 
DECLARE @Comment varchar(100); 
SET @Name = (SELECT Item FROM @Split WHERE RowIndex=1); 
SET @Phone = (SELECT Item FROM @Split WHERE RowIndex=2); 
SET @Comment = (SELECT Item FROM @Split WHERE RowIndex=3); 
+1

Vous pouvez également faire pivoter les résultats, puis vous pouvez faire SELECT @name = Field1, @Phone = Field2, etc ...? – MatBailie

1

En supposant que les lignes sont ordonnées, vous voulez faire un pivot pour les transformer en colonnes.

Une autre option est d'avoir votre fonction d'analyse syntaxique (ou une version modifiée) retourne un jeu de résultats d'une seule ligne (fonction de table d'une valeur) et utiliser CROSS/OUTER APPLY pour les ajouter à une ligne:

http://msdn.microsoft.com/en-us/library/ms174853.aspx

Questions connexes