2017-01-14 12 views
2

如何創建一個存儲過程來創建一個表,其結構存儲在另一個表中,當然還有t-sql和sql server?T-SQL如何創建其結構位於另一個表中的表?

+0

什麼是存儲在另一個表?結構像information_schema.columns或者你想重複表結構?要複製結構,使用'select top 0 * into newtable from ...'。 – Deadsheep39

+0

耶列,將要用來填補新表的柱子! – Ayoubleb

回答

3

T-SQL允許創建使用SELECT * ... INTO語法的飛行表:

SELECT * INTO TargetTable 
FROM SourceTable 
-- any false returning condition will do 
WHERE 1 = 0 

這也可以文筆優美(感謝Deadsheep39):

SELECT TOP 0 * INTO TargetTable 
FROM SourceTable 

然而,這將失敗TargetTable已經存在,因此您應該檢查其是否存在:

IF OBJECT_ID('TheSchema.TargetTable') IS NOT NULL 
    DROP TABLE TargetTable 

另外,不會創建索引,約束或觸發器。檢查here瞭解更多詳情。

如果你想要去的動態(表名是參數),您可以創建並執行動態查詢:

CREATE PROCEDURE dbo.GenerateTable 
(
    @SourceTable VARCHAR(128), 
    @TargetTable VARCHAR(128) 
)  
AS 
BEGIN 
    DECLARE @SQL NVARCHAR(4000) = N' 
     SELECT * INTO ' + QUOTENAME(@TargetTable) + ' 
     FROM ' + QUOTENAME(@SourceTable) + ' 
     -- any false returning condition will do 
     WHERE 1 = 0' 
    EXEC (@SQL) 
END 
GO 
+0

檢查是否存在可以通過系統函數簡化** object_id ** - '如果object_id('dbname.schema.tablename')不爲null drop table dbname.schema.tablename'或者如果您只使用默認模式如果object_id('tempdb ..#tablename')不是null drop table tempdb ..#tablename',則表示object_id('tablename')不爲null drop table tablename'或tempdb上的示例。 – Deadsheep39

+0

@ Deadsheep39 - 我按照你的建議簡化了對象存在檢查。謝謝。 – Alexei

2

您可以使用CREATE TABLE語句將查詢構造爲字符串,並使用sp_executesql存儲過程執行它。

例如以這種方式:

DECLARE @query nvarchar(max) = N'CREATE TABLE Table(Col nvarchar(50) NULL)' 
EXECUTE sp_executesql @query 

凡在@query變量,你可以建立一個基於你需要什麼樣的表。

+0

因此,基本上,您可以用比所需的更困難的方式執行create table語句,輸入必須手動定義?對於OP來說不是一個好的答案,-1。 – Tobb

+0

據我瞭解,問題是如何動態創建一個表,它的結構存儲在另一個表中。 –

+0

是的,您可以使用SELECT INTO,但在問題中沒有指定什麼樣的新表結構。只有在後面的評論「耶列,將用於填補新表」columbums「 –

相關問題