2016-06-14 51 views
-2

我在嘗試這個查詢,但它不工作。如何使用存儲過程動態地在SQL Server中插入列?

CREATE PROCEDURE USP_UPDATEUSERS_0 
    @COLUMNNAME NVARCHAR(30), 
    @DATATYPE NVARCHAR(30) 
AS 
    ALTER TABLE HC_USER_MAIN 
     ADD COLUMNNAME = @COLUMNNAME DATATYPE = @DATATYPE 

,但我得到這個錯誤:

Msg 102, Level 15, State 1, Procedure USP_UPDATEUSERS_0, Line 1
Incorrect syntax near '='.

+5

你查查語法來添加一列? – HoneyBadger

+5

這有其糟糕的設計。爲什麼你希望存儲過程首先執行DDL語句? –

+2

爲什麼要麻煩一個程序。我沒有看到執行'EXECUTE USP_UPDATEUSERS_0'NewColumn','VARCHAR(50)'的方式比'ALTER TABLE HC_USER_MAIN ADD NewColumn VARCHAR(50)'更方便' – GarethD

回答

0

您可以使用動態SQL的幫助(以及更好地利用sysname此),使其:

CREATE PROCEDURE USP_UPDATEUSERS_0 
    @COLUMNNAME sysname, 
    @DATATYPE sysname 
AS 
DECLARE @sql nvarchar(max) 
--To check if column with that name not exists 
IF NOT EXISTS(
SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.columns 
WHERE TABLE_NAME = 'HC_USER_MAIN' and COLUMN_NAME = @COLUMNNAME) 
--If not exists then add new column 
SELECT @sql = 'ALTER TABLE HC_USER_MAIN ADD ' + QUOTENAME(@COLUMNNAME) + ' ' + @DATATYPE 
EXEC sp_executesql @sql 
+4

不是我同意答案,但你至少應該使用'QUOTENAME'而不是簡單地連接括號,如果有人發送了像'Test] INT這樣的東西,它會正確地轉義列名; DROP TABLE HC_USER_MAIN; - '。 – GarethD

+0

想到這個以太。 – gofr1

+0

那麼,我的回答對你有幫助嗎?你檢查了嗎? – gofr1

相關問題