我知道我的标题是不完全的措辞好,所以让我澄清。 我使用的是SQL Server 2005 Express的。
我有一个基本存储表“模板,”如果你愿意。 使用汽车为例,该领域会是这样的:
TemplateID
Color
Make
Model
现在,我有一个表示模板的“实例”另一个表。 它包含模板表的所有字段以及一些领域所特有的一个实例:
InstanceID
VIN
SerialNumber
Color
Make
Model
我写一个存储过程中插入新行,在“实例”表。 这个存储过程将采取“VIN”和输入参数“的SerialNumber,”但我希望它复制“颜色”,“让”,并从相应的“型号”,“模板”。 该模板位于由这已经是众所周知的“TemplateID”。
我在寻找咨询如何写这个存储过程。 这将是简单的,如果它不是一个事实,即这些表包含100多个字段(我没有设计他们,但我使用它们卡住了。)我想这样做:
INSERT INTO Instance(VIN, SerialNumber, "EverythingElse")
VALUES (@VIN, @SerialNumber, SELECT * FROM Template WHERE TemplateID = 1)
换句话说,我只想提供(通过参数)没有存储在“模板”的领域和复制一切从其他模板。 是这样的事情可能没有手工编码,每场?
Just do a INSERT INTO and use a SELECT statement instead of a values statement.
INSERT INTO Instance(VIN, SerialNumber, a, b, c)
SELECT @VIN, @SerialNumber, a, b, c FROM Template WHERE TemplateID = 1;
You really don't want to use *. You can have SQL Server Managemnt Studio script a SELECT statement for you and it will generate the field names so you don't have to type them.
然后你可以使用动态SQL这样的...
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;
文章来源: How can I copy all fields of one table to another, wider table in SQL Server 2005 Express?