2011-03-29 3 views
0

Je dois préparer un script qui sélectionne des données à partir de quelques tables et insère de nouvelles lignes dans la table dans laquelle une sorte de relation plusieurs-à-plusieurs est stockée. Donc, fondamentalement, j'ai deux tables avec le champ uniqueidentifier comme clé primaire et une autre table qui stocke deux clés étrangères de ces tables et quelques données supplémentaires. La clé primaire de cette table est également la uniqueidentifier.Génération GUID déterministe dans T-SQL

INSERT ResultTable ([primaryKey],[foreignA], [foreignB]) 
    SELECT newid(), /* <- Can't have it! */ 
      @foreignKeyA, 
      fb.[primaryKey] 
    FROM foreignTableB as fb 

Le problème est que je ne peux pas utiliser newid() pour générer GUIDs pour mes données générées. L'une des exigences est que le script produise des résultats identiques (clés primaires incluses) lorsqu'il est exécuté sur des tables identiques. Je dois donc créer un script qui va insérer de nouvelles lignes avec la valeur uniqueidentifier générée en fonction de deux autres valeurs uniqueidentifier. Maintenant, je ne connais pas de fonctions qui fournissent le mappage d'un GUID à un autre. Probablement il n'y en a pas. Mais j'espère toujours entendre quelques propositions et conseils.

aussi:

  • On peut supposer que toute paire de clés étrangères est unique dans la table
  • Je ne peux pas changer le type de champs de clé primaire dans l'une des tables mentionnées
  • Il est principalement SQL Server 2005/2008, mais certains peuvent exécuter SQL Server 2000

Merci d'avance.

+0

sons comme ce serait la même que la prise entier # 1 et nombre entier # 2, et en les mélangeant d'une manière ou d'une autre de sorte que l'entier # 3 peut être utilisé comme clé primaire. Je ne suis pas au courant d'un moyen de le faire avec une certitude de 100% de deux paires d'entiers - ou GUID - ne produisant pas le même nombre "entier" de sortie. (Les algorithmes de hachage peuvent vous rapprocher, si vous pouvez en trouver un qui génère des valeurs GUID) –

+0

@Philip Kelley: Je suis sûr que je peux faire quelque chose comme ça en convertissant les deux GUID en chaînes et en les manipulant avec des caractères (réorganisation) puis convertir la chaîne résultante en 'uniqueidentifier'. Je finirais probablement par faire quelque chose comme ça (même si c'est incroyablement sale et probablement une mauvaise idée), mais j'ai décidé que je ne devais pas – Dyppl

Répondre

2

Votre meilleure réponse ici est de générer un script qui est une liste d'instructions d'insertion. Ce script peut être généré à partir d'un autre script qui génère la chaîne SQL dynamique. Vous allez probablement faire cela de façon itérative, ce qui appelle votre fonction guid à chaque boucle. De cette façon, à la fin, vous aurez une liste d'inserts qui peuvent être exécutés plusieurs fois avec les mêmes résultats avec des guids.

Mais l'une des dimensions de la génération GUIDs est le temps que vous ne serez jamais en mesure de reproduire le guid (ce qui est une sorte de point vraiment)

+0

Merci pour vos conseils (un peu en retard), c'est presque exactement ce que j'ai fini faire hier. Il ne répond pas vraiment à la question de générer des valeurs 'uniqueidentifier' mais il résout le problème dans mon cas, donc je marque votre réponse. – Dyppl