我怎样才能复制SQL Server 2005 Express的一个表到另一个的各个领域,更广泛的表?

2019-09-30 07:12发布

我知道我的标题是不完全的措辞好,所以让我澄清。 我使用的是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)

换句话说,我只想提供(通过参数)没有存储在“模板”的领域和复制一切从其他模板。 是这样的事情可能没有手工编码,每场?

Answer 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.



Answer 2:

然后你可以使用动态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?