2010-09-28 4 views
1

Je suis un SQL Server 2005 newb et je dois faire quelque chose qui devrait être facile mais j'ai des difficultés.SQL Server 2005 séparez la valeur CSV de la procédure stockée en plusieurs colonnes?

Pour le moment ma procédure stockée stocke csv dans une colonne dans mon db. J'ai besoin de séparer le csv en plusieurs colonnes. Le nombre de valeurs dans un paramètre CSV est statique, il y aura toujours 8 valeurs et elles seront toujours dans le même ordre. Voici un exemple des données:

req,3NxWZ7RYQVsC4chw3BMeIlywYqjxdF5IUX8GMUqgJlJTztcXQS,192.168.208.78,getUserInfo,AssociateService,03303925,null,M042872, 

Quelle est la meilleure fonction à utiliser pour séparer ce paramètre dans une procédure stockée afin que je puisse l'insérer dans des colonnes séparées? Je regardais la sous-chaîne mais cela semble être positionnel et pas regex conscient?

Merci, Chris

Répondre

2

SQL Server ne possède pas la fonctionnalité native; vous devez construire une fonction (généralement appelée "split"). Ce thread provides a number of TSQL options, à la recherche de la même réponse que vous êtes après - ce qui fonctionne le mieux. Là où ils manquent est de tester de grandes quantités de données délimitées par des virgules, mais alors votre exigence est seulement de huit valeurs par colonne ...

SQL Server 2005+ prend en charge SQLCLR, où la fonctionnalité peut être transférée au code .NET. Le code .NET doit être déployé sur l'instance SQL Server en tant qu'assemblage et les fonctions/procédures TSQL doivent être créées pour exposer la fonctionnalité au sein de l'assembly.

+0

Malheureusement, mes administrateurs de base de données n'aiment pas activer CLR sur nos serveurs DB. YEAH pour moi. – chris

+0

@chris: Très commun, c'est pourquoi j'ai ajouté la partie CLR par la suite. J'aime l'idée de la fonctionnalité, mais je pense à la façon dont les gens l'utilisent probablement. –

2

SUBSTRINGest de position, mais vous pouvez utiliser la fonction CHARINDEX pour trouver la position de chaque delimiter et saisir les sous-chaînes entre chaque virgule.

Il est une solution maladroite, pour être sûr, mais l'impact est réduite au minimum donné un petit nombre statique de champs qui apparaissent toujours dans l'ordre ...

0

SQL Server n'est pas très forte dans la gestion des chaînes - surtout si vous ne pouvez pas utiliser SQL-CLR pour aider. Il vaudrait peut-être mieux que vous le fassiez auparavant, dans votre application client, en utilisant quelque chose comme FileHelpers, une bibliothèque C# qui importe très facilement un fichier CSV et le divise en un objet pour chaque ligne. Une fois que vous avez cela, vous pouvez facilement parcourir le tableau d'objets que vous avez et insérer ces propriétés individuelles dans une table relationnelle.

Questions connexes