2012-12-19 58 views
1

可能重複:
ALTER TABLE my_table ADD @column INTT-SQL存儲過程的列動態添加到基於參數的表

誰能告訴我,如果有可能有一個存儲過程這實際上是這樣的:

USE [dbname] 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE [Schema].[CreateColumn] 
    @Table varchar(255), 
    @ColumnName varchar(255) 
AS 
BEGIN 
    BEGIN TRANSACTION 
     SET QUOTED_IDENTIFIER ON 
     SET ARITHABORT ON 
     SET NUMERIC_ROUNDABORT OFF 
     SET CONCAT_NULL_YIELDS_NULL ON 
     SET ANSI_NULLS ON 
     SET ANSI_PADDING ON 
     SET ANSI_WARNINGS ON 
    COMMIT 

    BEGIN TRANSACTION 
     ALTER TABLE [Schema][email protected] ADD @ColumnName varchar(255) NULL 
     ALTER TABLE [Schema][email protected] SET (LOCK_ESCALATION = TABLE) 
    COMMIT 
END 
GO 

基本上,我可以傳遞一個表名和列名,它會通過正確的交易在該表上創建它。

+4

你需要動態SQL http://www.sommarskog.se/dynamic_sql.html –

回答

3

對不起,這是不可能的。看到這個網站。

對不起,但事實並非如此。

然而,這是笨拙的。您只需執行內聯SQL(如果是表單客戶端代碼)或者每次簡單地編寫一條SQL語句就可以了,因爲每次需要定義表名稱,列名稱,列數據類型和默認值你會執行(除非你在這些參數中硬編碼,即列數據類型總是VarChar(255)。

玩這個變化,看看你是否找到你要找的東西。可能是更好的方法來acheive你正在嘗試做的:

DECLARE @sql NChar(4000); 

SET @Sql = N'ALTER TABLE [Schema].' 
    + @TableName + ' ADD ' 
    + @ColumnName + ' ' 
    + @ColumnType + ' ' 
    + @InitialValue 

EXECUTE sp_executesql @sql 
GO 
+1

這是不可能的,因爲OP需要,而不是使用動態SQL。 –

1

對不起,這是不可能的。見this website

+1

你在技術上是正確的,我想這樣做不動SQL但現在我知道我不能。 – test