2010-02-01 51 views
1

我知道我的標題並不完全措辭,所以讓我澄清。我正在使用SQL Server 2005 Express。如何將一個表的所有字段複製到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) 

換句話說,我只想提供(通過參數)未存儲在「模板」中的字段,並從模板中複製其他所有內容。沒有每個領域的手工編碼都可能有這樣的事情嗎?

回答

0

只需執行INSERT INTO並使用SELECT語句而不是值語句。

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

你真的不想使用*。您可以爲SQL Server Managemnt Studio腳本提供SELECT語句,它將生成字段名稱,因此不必鍵入它們。

+0

這個唯一的問題是,我將有100多個字段名(A,B,C,......) 。我試圖避免創建這樣的超長查詢。我意識到這可能是不可能的,但我想我會問是否有更好的方法。 – 2010-02-01 19:49:34

+0

看到我的其他答案。 – ctrlShiftBryan 2010-02-01 19:56:55

+0

你爲什麼反對100個列名?如果這就是它,那就是itisi。就我個人而言,在寫d =代碼時,我將它們從對象oexporer中拖放出來,但那只是我自己。這是上面動態的解決方案。 – HLGEM 2010-02-01 20:00:50

1

然後你可以使用動態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; 
相關問題