2009-07-02 4 views
0

Nous avons une situation dans laquelle nous devons stocker des données de formulaire dans notre serveur SQL, mais chaque nouveau travail que nous configurons aura des champs différents avec des noms de champs et des longueurs différents. Un exemplePuis-je créer une vue dynamique des données XML dans Sql Server 2005?

Job 1: 
    Field 1: first_name - varchar(20) 
    Field 2: last_name - varchar(30) 

Job 2: 
    Field 1: first_name - varchar(15) 
    Field 2: middle_initial - varchar(1) 
    Field 3: last_name - varchar(30) 

Initialement nous étions en train de mettre en place des tables séparées pour stocker ces données qui étaient exactement conformes à la forme en question. Mais cela a conduit à un cauchemar de maintenance car il y avait tellement de paquets de tables, de processeurs, de dts, de ssis à changer à chaque fois afin de tenir compte de la nature dynamique de ces données.

Nous avons trouvé une solution différente pour stocker toutes les données dans les champs XML, résolvant ainsi la plupart du problème. Il existe maintenant semblable à ceci.

<Record> 
    <first_name>value</first_name> 
    <last_name>value</last_name> 
</Record> 

Ensuite, nous créer des vues pour tirer ces données sur la table

SELECT 
, IsNull(data.value('(/Record/first_name)[1]', 'varchar(20)'),'') as first_name 
, IsNull(data.value('(/Record/last_name)[1]', 'varchar(30)'),'') as last_name 
FROM FormTable 

Maintenant, ce qui est beaucoup mieux que nous avions avant, mais cela signifie aussi que nous avons encore besoin de créer l'affichage de chaque temps. Je préfère maintenir un certain type de table qui répertorie les champs et construira cette requête pour moi.

Field Name | Field Type | Field Length 
first_name | varchar | 20 
last_name | varchar | 30 

Je suis assez sûr que je ne peux pas créer une vue dynamique. Une option qui pourrait fonctionner est une fonction de valeur table. Mais y a-t-il quelque chose que je néglige ici? Y aurait-il de meilleures options pour stocker dynamiquement les données de cette manière (sans quitter SQL SERVER puisque je sais que d'autres bases de données comme CouchDB le feront nativement?)

Répondre

0

ne fonctionnerait pas, car vous ne pouvez pas utiliser les tables dynamiques SQL ou temporaires (que vous auriez certainement besoin d'utiliser pour cela).

Une procédure stockée serait le choix évident - il peut faire tout ce que vous devez faire, mais le problème est bien sûr que vous ne pouvez pas sélectionner à partir d'une procédure stockée.

Je regardais this page qui parle d'un tas d'options pour faire des choses comme ça. L'une des options dont il parle est d'utiliser OPENQUERY, qui semble comme il serait très facile, mais il pourrait y avoir des problèmes de performance:

SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC sp_getformdata') 

Quoi qu'il en soit, vous pourriez vouloir vérifier ce lien pour obtenir quelques idées supplémentaires.

+0

Que voulez-vous dire par "impossible de sélectionner à partir d'une procédure stockée"? Pourquoi ne pas simplement renvoyer le résultat au SP? –

+0

Eh bien, vous ne seriez pas capable de faire un "SELECT first_name, last_name FROM sp_getformdata" - Ce qui est infact ce que nous devons faire parce que la prochaine partie de ce processus prend les données de scission et le formate de plusieurs façons pour des exemples "SELECT first_name +", "+ last_name FROM sp_getformdata" –

+0

Merci pour les informations et j'ai lu ce lien avant. Chacune de ces options semble avoir un certain type de pénalité et lorsque nous travaillons avec des centaines de milliers d'enregistrements, je ne peux pas prendre le coup de la performance. –

Questions connexes