2011-04-09 2 views
2

j'ai données dans le format suivant dans une table de base de données SQL ServerSql Server Split et Enchaînement

[CPOID] [ContractPO]  [ContractPOTitle] 
1  10-SUP-CN-CNP-0001 Drytech 
2  10-SUP-CN-CNP-0002 EC&M 

J'ai besoin d'écrire une procédure stockée pour générer le résultat suivant

[CPOID]  [ContractPO]  [ContractPOTitle] [ConcatField] 
    1  10-SUP-CN-CNP-0001 Drytech   CNP-0001-Drytech    
    2  10-SUP-CN-CNP-0002 EC&M    CNP-0002-EC&M 

où [ConcatField ] générer le résultat en divisant les deux dernières valeurs de la colonne [ContractPOTitle] et en combinant avec [ContractPOTitle]

+3

Veuillez écrire le code que vous avez écrit jusqu'à maintenant. Les gens n'aiment généralement pas écrire votre code pour vous. Comme c'est, c'est une description de travail, pas une question. –

+1

En outre, vous pouvez spécifier si la mise en forme des nombres changera, car s'ils le font, vous devrez également prévoir cela. Vous voudrez peut-être lire sur le [SubString] (http://msdn.microsoft.com/en-us/library/ms187748.aspx) et le [CharIndex] (http://msdn.microsoft.com/en- us/library/ms186323.aspx) fonctionne comme ces fonctions joueront un rôle important dans ce que vous cherchez à accomplir. EDIT: J'ai oublié la fonction [Reverse] (http://msdn.microsoft.com/en-us/library/ms180040.aspx), vous devriez vous familiariser avec cette fonction ainsi –

Répondre

3

Si le champ ContractPO a toujours la même longueur, vous pouvez simplement faire:

SELECT 
    CPOID, 
    ContractPO, 
    ContractPOTitle, 
    RIGHT(ContractPO, 8) + '-' + ContractPOTitle as [ConcatField] 
FROM MyTable 

En supposant que la longueur du champ ContractPO est pas fixe et nous devons compter sur le démembrement du texte après l'avant-dernier « - », l'instruction SQL suivante fonctionnera. C'est un peu moche, mais ces types d'opérations sont nécessaires car il ne semble pas y avoir de fonction LASTINDEX disponible dans SQL Server.

SELECT 
    CPOID, 
    ContractPO, 
    ContractPOTitle, 
    RIGHT(ContractPO, CHARINDEX('-', REVERSE(ContractPO), CHARINDEX('-', REVERSE(ContractPO)) + 1) - 1) + '-' + ContractPOTitle as [ConcatField] 
FROM @myTable 
+0

Votre code suppose que le format de ContractPO déposé ne changera pas, l'OP devra nous dire ce qui se passe après 10-SUP-CN-CNP-9999, est le prochain numéro 10-SUP-CN-CNP-10000? Si c'est le cas, votre solution va se casser. Une meilleure approche serait d'utiliser SubString, CharIndex et Reverse à la place. –

+1

@Mark Vous avez raison, et j'ai mis à jour ma réponse pour analyser le texte après le second '-'. Cependant, je voulais juste souligner que j'ai qualifié ma première réponse par "Si le champ ContractPO est toujours de la même longueur", puisque le PO n'a pas spécifié. =] – rsbarro

+0

+1 Très bon travail! Je crois que cela devrait fonctionner pour l'OP –