2016-11-02 33 views
1

我想創建一個存儲過程,它創建了一個新表,但問題在於表名和列(count列和數據類型)是動態的。如何通過存儲過程創建具有動態列的表

因此,該程序可能應該需要兩個參數: 表名和列的列表(此列表中的列和數據類型的名稱)

有沒有辦法做這樣的事情?

+0

您需要清楚您所問的軟件和語言。這是關於一些數據庫系統嗎? SQL也許? –

+0

你好,這是微軟的SQL服務器。 – user1912372

+0

如果要更改表或列,那麼生成存儲過程沒有意義。你沒有任何優勢 - 不是性能,因爲執行計劃不能被重用。不安全,因爲您必須生成一個SQL字符串並運行它。不是抽象或簡化,因爲你最終暴露了你想要抽象的所有東西。事實上,你*引入*安全問題,因爲你的SQL字符串可能會受到SQL注入 –

回答

1

你可以像這樣創建動態SQL。

  • 發送表名作爲參數傳遞給SP
  • 發送數據表與colunName,數據類型,以SP(用戶定義的表)

要發送列表,數據表,你需要創建用戶定義的表

CREATE TYPE [dbo].[myColumnDatatyes] AS TABLE(
    columnName [NVARCHAR](200) NULL, 
    columnDataType [NVARCHAR](200) NULL 
); 

然後在SP中使用這個UDT就像這樣,創建光標以循環遍歷表並創建動態SQL語句。

Create Procedure sp_CreateDynamicTables(
@tableName nvarchar(150), 
@tableSchema [myColumnDatatyes] readonly 
) 
AS BEGIN 
DECLARE @sql NVARCHAR(MAX); 

set @SQL= N' Create table '+QUOTENAME(@tableName); 

set @SQL [email protected]+ ' Here loop over @tableSchema to add N Columns ' 

EXECUTE sp_executesql @sql 
END