2010-02-01 3 views
1

Je sais que mon titre n'est pas très bien libellé, alors laissez-moi clarifier. J'utilise SQL Server 2005 Express.Comment puis-je copier tous les champs d'une table vers une autre table plus large dans SQL Server 2005 Express?

J'ai une table qui stocke essentiellement un "modèle", si vous voulez. L'utilisation d'une voiture comme un exemple, les champs seraient quelque chose comme:

TemplateID 
Color 
Make 
Model 

Maintenant, j'ai une autre table qui représente une « instance » du modèle. Il contient tous les champs de la table de modèle ainsi que quelques champs qui sont uniques à une instance:

InstanceID 
VIN 
SerialNumber 
Color 
Make 
Model 

Je vous écris une procédure stockée pour insérer une nouvelle ligne dans la table « instance ». Cette procédure stockée prendra des paramètres d'entrée pour "VIN" et "SerialNumber", mais je veux copier "Color", "Make" et "Model" à partir du "Template" approprié. Le modèle est localisé par le "TemplateID", qui est déjà connu.

Je cherche des conseils sur la façon d'écrire cette procédure stockée. Il serait simple s'il n'y avait pas le fait que ces tables contiennent plus de 100 champs (je ne les ai pas la conception, mais je suis coincé à les utiliser.) Je voudrais faire quelque chose comme:

INSERT INTO Instance(VIN, SerialNumber, "EverythingElse") 
VALUES (@VIN, @SerialNumber, SELECT * FROM Template WHERE TemplateID = 1) 

En d'autres termes, je veux seulement fournir (par des paramètres) les champs non stockés dans le "Modèle" et copier tout le reste du modèle. Est-ce que quelque chose comme ça est possible sans codage manuel pour tous les domaines?

Répondre

0

Il suffit de faire un INSERT INTO et d'utiliser une instruction SELECT au lieu d'une instruction de valeurs.

INSERT INTO Instance(VIN, SerialNumber, a, b, c) 
SELECT @VIN, @SerialNumber, a, b, c FROM Template WHERE TemplateID = 1; 

Vous ne voulez vraiment pas utiliser *. SQL Server Managemnt Studio script peut être une instruction SELECT pour vous et il génèrera les noms des champs afin que vous n'ayez pas à les taper.

+0

Le seul problème avec cela est que j'aurais 100+ noms de champs (a, b, c, .......) . J'essaie d'éviter de créer une requête super longue comme ça. Je me rends compte que ce n'est peut-être pas possible, mais je pensais que je demanderais de voir s'il y avait un meilleur moyen. –

+0

Voir mon autre réponse. – ctrlShiftBryan

+0

POURQUOI objecteriez-vous à 100 noms de colonnes? Si c'est waht Itis, c'est ce que Itisi. Personnellement, je les fais glisser de l'objet oexporer quand j'écris d = code, mais c'est juste moi. C'est une solution meilleure que celle dynamique ci-dessus. – HLGEM

1

Ensuite, vous pouvez utiliser SQL dynamique comme ça ...

DECLARE 
    @Fields nvarchar(Max), 
    @SQL nvarchar(Max); 

SELECT 
    @Fields = COALESCE(@Fields + ',', '') + column_name 
FROM 
    information_schema.columns 
WHERE 
    table_schema = 'dbo' AND 
    table_name = 'Instance' AND 
    column_name <> 'PrimaryKeyID' --here you exclude columns 
ORDER BY 
    ordinal_position; 


SET @SQL = 'INSERT INTO dbo.Instance' 
    + ' (' 
    + @Fields 
    + ') SELECT ' 
    + ' (' 
    + @Fields 
    + ') FROM Template;'    

EXECUTE sp_executesql @SQL; 
Questions connexes