2010-04-10 17 views
7

यदि मैं नए चरम के नाम के रूप में एक चर का उपयोग करना चाहता हूं, तो यह एमएस एसक्यूएल में सकारात्मक है?वैकल्पिक तालिका my_table ADD @column INT

उदाहरण न कि काम:

ALTER TABLE my_table ADD @column INT 

यह मेरे लिए महान काम किया:

EXEC ('ALTER TABLE my_table ADD ' + @column + ' INT') 
+0

त्रुटि इसकी दे क्या है एक नज़र है? –

+0

@ माहेश वेलागा: त्रुटि संदेश अप्रासंगिक है। यह वैकल्पिक टैबलेट स्टेटमेंट – gbn

+1

के लिए बस गलत वाक्यविन्यास है, यह करने से पहले आप चर (@ कॉलम) को स्वच्छ करें ... यह बेहद जरूरी है या आपको –

उत्तर

14

इस गतिशील एसक्यूएल का उपयोग कर अपने DDL निर्माण करने के लिए और स्ट्रिंग निष्पादित करने के लिए EXEC आदेश का उपयोग संभव है ।

Declare @SQL VarChar(1000) 

SELECT @SQL = 'ALTER TABLE my_table ADD ' + @column + ' INT' 

Exec (@SQL) 

this आलेख देखें।

मैं यह भी जोड़ूंगा कि जिस क्षण आप गतिशील एसक्यूएल की भूमि पर जाते हैं, आपको SQL Injection attacks पर खुद को बेनकाब करने की देखभाल करने की आवश्यकता नहीं है। हमेशा आने वाले पैरामीटर को साफ करें।

फिलिप का उल्लेख है - ऐसा करने से पहले लंबे और कठिन सोचें। तथ्य यह है कि यह संभव है कि यह एक अच्छी बात न करे ...

एरलैंड सोमरस्क ने गतिशील एसक्यूएल - The curse and blessings of dynamic SQL का उपयोग करने के बारे में एक व्यापक लेख लिखा जो मैं पूरी तरह से पढ़ने की अनुशंसा करता हूं।

+1

पर पछतावा होगा यह भी सुनिश्चित करें कि चर के मान को त्रुटियों और एसक्यूएल इंजेक्शन के लिए स्वच्छ किया गया है। –

+1

... लेकिन यह विशेष रूप से अच्छा विचार नहीं है, क्योंकि आप आरक्षित शब्दों (कॉलम "कॉलम") या एम्बेडेड रिक्त स्थान वाले नामक कॉलम के साथ समाप्त हो सकते हैं। ऐसा करने से पहले लंबे और कठिन सोचो! –

+0

मुझे अक्सर पता चलता है कि EXEC का उपयोग करना पहला संकेत है कि मैं खरपतवार में बंद हूं। लेकिन मौलिक रूप से यह खराब विकल्प का सबसे अच्छा है – greg

1

पर (EXECUTE (Transact-SQL))

CREATE TABLE MyTable(
     ID INT 
) 
GO 
SELECT * FROM MyTable 
GO 
DECLARE @column VARCHAR(100) 
SET @column = 'MyNewCol' 
EXEC('ALTER TABLE MyTable ADD ' + @column + ' INT') 
GO 
SELECT * FROM MyTable 
GO 
DROP TABLE MyTable 
0
alter procedure sp_check_table_column 
(
    @field_name varchar(max), 
    @data_type varchar(max), 
    @mandatory varchar(max) 
) 
as 
if not exists (select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '<table_name>' and COLUMN_NAME = @field_name) 
begin 
declare @sql varchar(max) 
set @sql = ('ALTER TABLE <table_name> ADD ' + @field_name + ' ' + @data_type + ' ' + @mandatory) 
exec (@sql) 
end 
संबंधित मुद्दे