tsql - किसी विशिष्ट कॉलम के बाद एक कॉलम कैसे जोड़ सकता है?




alter-table (6)

आपको तालिका को फिर से बनाना होगा सौभाग्य से, कॉलम के क्रम में कोई फर्क नहीं पड़ता!

जैसे ही मैं आपके कॉलम को क्रमित करता हूँ,

SELECT ID, Newfield, FieldA, FieldB FROM MyTable

इसके अलावा यह पहले एक bazillion बार के बारे में पूछा गया है।

मेरे पास एक मेज है:

MyTable
    ID
    FieldA
    FieldB

मैं तालिका को बदलना चाहता हूं और एक कॉलम जोड़ना चाहता हूं ताकि यह दिखता है:

MyTable
    ID
    NewField
    FieldA
    FieldB

MySQL में मैं ऐसा एक होगा:

ALTER TABLE MyTable ADD COLUMN NewField int NULL AFTER ID;

एक पंक्ति, अच्छा, सरल, महान काम करता है माइक्रोसॉफ्ट की दुनिया में मैं यह कैसे कर सकता हूं?


दुर्भाग्य से आप नहीं कर सकते

यदि आप वास्तव में उस क्रम में चाहते हैं तो आपको उस क्रम में कॉलम के साथ एक नई तालिका बनाना होगा और डेटा को कॉपी करना होगा। या स्तंभ आदि का नाम बदलें। कोई आसान तरीका नहीं है।


माइक्रोसॉफ्ट एसक्यूएल सर्वर मैनेजमेंट स्टूडियो (एमएसएसक्यूएल के लिए एडमिशन टूल) में सिर्फ एक टेबल पर "डिज़ाइन" पर जाकर कॉलम को नई स्थिति में खींचें। कमांड लाइन नहीं है लेकिन आप ऐसा कर सकते हैं।


/ * किसी तालिका के स्तंभ आदेश को बदलने के लिए स्क्रिप्ट
नोट करें कि मूल तालिका को बदलने के लिए यह एक नई तालिका बनाएगा
हालांकि यह ट्रिगर या अन्य तालिका गुणों की प्रतिलिपि नहीं करता - केवल डेटा
* /

कॉलम के साथ एक नई तालिका उत्पन्न करें, जिसके लिए आपको आवश्यकता होती है

Select Column2, Column1, Column3 Into NewTable from OldTable

मूल तालिका हटाएं

Drop Table OldTable;

नई तालिका का नाम बदलें

EXEC sp_rename 'NewTable', 'OldTable';


यह बिल्कुल संभव है हालांकि आपको यह तब तक नहीं करना चाहिए जब तक आप यह नहीं जानते कि आप क्या काम कर रहे हैं। इसे समझने के बारे में मुझे 2 दिन लग गए यहां एक संग्रहीत कार्यविधि है जहां मैं दर्ज करता हूं: --- डेटाबेस नाम (स्कीमा नाम पठनीयता के लिए "_" है) --- तालिका का नाम --- कॉलम --- कॉलम डेटा प्रकार (कॉलम जोड़ा गया हमेशा शून्य होता है, अन्यथा आप जीता ' सम्मिलित करने में सक्षम नहीं हो सकता है) --- नए कॉलम की स्थिति।

चूंकि मैं सैम टूलकिट (और उनमें से कुछ> 80 कॉलम) से तालिकाओं के साथ काम कर रहा हूं, इसलिए सामान्य चर क्वेरी को शामिल करने में सक्षम नहीं होगा। यह बाहरी फाइल की आवश्यकता को बल देता है अब सावधान रहें कि आप उस फ़ाइल को स्टोर करते हैं और एनटीएफएस और नेटवर्क के स्तर पर किसकी पहुंच है।

चीयर्स!

USE [master]
GO
/****** Object:  StoredProcedure [SP_Set].[TrasferDataAtColumnLevel]    Script Date: 8/27/2014 2:59:30 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [SP_Set].[TrasferDataAtColumnLevel]
(
    @database varchar(100),
    @table varchar(100),
    @column varchar(100),
    @position int,
    @datatype varchar(20)    
)
AS
BEGIN
set nocount on
exec  ('
declare  @oldC varchar(200), @oldCDataType varchar(200), @oldCLen int,@oldCPos int
create table Test ( dummy int)
declare @columns varchar(max) = ''''
declare @columnVars varchar(max) = ''''
declare @columnsDecl varchar(max) = ''''
declare @printVars varchar(max) = ''''

DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR 
select column_name, data_type, character_maximum_length, ORDINAL_POSITION  from ' + @database + '.INFORMATION_SCHEMA.COLUMNS where table_name = ''' + @table + '''
OPEN MY_CURSOR FETCH NEXT FROM MY_CURSOR INTO @oldC, @oldCDataType, @oldCLen, @oldCPos WHILE @@FETCH_STATUS = 0 BEGIN

if(@oldCPos = ' + @position + ')
begin
    exec(''alter table Test add [' + @column + '] ' + @datatype + ' null'')
end

if(@oldCDataType != ''timestamp'')
begin

    set @columns += @oldC + '' , '' 
    set @columnVars += ''@'' + @oldC + '' , ''

    if(@oldCLen is null)
    begin
        if(@oldCDataType != ''uniqueidentifier'')
        begin
            set @printVars += '' print convert('' + @oldCDataType + '',@'' + @oldC + '')'' 
            set @columnsDecl += ''@'' + @oldC + '' '' + @oldCDataType + '', '' 
            exec(''alter table Test add ['' + @oldC + ''] '' + @oldCDataType + '' null'')
        end
        else
        begin
            set @printVars += '' print convert(varchar(50),@'' + @oldC + '')'' 
            set @columnsDecl += ''@'' + @oldC + '' '' + @oldCDataType + '', '' 
            exec(''alter table Test add ['' + @oldC + ''] '' + @oldCDataType + '' null'')
        end
    end
    else
    begin 
        if(@oldCLen < 0)
        begin
            set @oldCLen = 4000
        end
        set @printVars += '' print @'' + @oldC 
        set @columnsDecl += ''@'' + @oldC + '' '' + @oldCDataType + ''('' + convert(character,@oldCLen) + '') , '' 
        exec(''alter table Test add ['' + @oldC + ''] '' + @oldCDataType + ''('' + @oldCLen + '') null'')
    end
end

if exists (select column_name from INFORMATION_SCHEMA.COLUMNS where table_name = ''Test'' and column_name = ''dummy'')
begin
    alter table Test drop column dummy
end

FETCH NEXT FROM MY_CURSOR INTO  @oldC, @oldCDataType, @oldCLen, @oldCPos END CLOSE MY_CURSOR DEALLOCATE MY_CURSOR

set @columns = reverse(substring(reverse(@columns), charindex('','',reverse(@columns)) +1, len(@columns)))
set @columnVars = reverse(substring(reverse(@columnVars), charindex('','',reverse(@columnVars)) +1, len(@columnVars)))
set @columnsDecl = reverse(substring(reverse(@columnsDecl), charindex('','',reverse(@columnsDecl)) +1, len(@columnsDecl)))
set @columns = replace(replace(REPLACE(@columns, ''       '', ''''), char(9) + char(9),'' ''), char(9), '''')
set @columnVars = replace(replace(REPLACE(@columnVars, ''       '', ''''), char(9) + char(9),'' ''), char(9), '''')
set @columnsDecl = replace(replace(REPLACE(@columnsDecl, ''  '', ''''), char(9) + char(9),'' ''),char(9), '''')
set @printVars = REVERSE(substring(reverse(@printVars), charindex(''+'',reverse(@printVars))+1, len(@printVars))) 

create table query (id int identity(1,1), string varchar(max))

insert into query values  (''declare '' + @columnsDecl + ''
DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR '')

insert into query values   (''select '' + @columns + '' from ' + @database + '._.' + @table + ''')

insert into query values  (''OPEN MY_CURSOR FETCH NEXT FROM MY_CURSOR INTO '' + @columnVars + '' WHILE @@FETCH_STATUS = 0 BEGIN '')

insert into query values   (@printVars )

insert into query values   ( '' insert into Test ('')
insert into query values   (@columns) 
insert into query values   ( '') values ( '' + @columnVars + '')'')

insert into query values  (''FETCH NEXT FROM MY_CURSOR INTO  '' + @columnVars + '' END CLOSE MY_CURSOR DEALLOCATE MY_CURSOR'')

declare @path varchar(100) = ''C:\query.sql''
declare @query varchar(500) = ''bcp "select string from query order by id" queryout '' + @path + '' -t, -c -S  '' + @@servername +  '' -T''

exec master..xp_cmdshell @query

set @query  = ''sqlcmd -S '' + @@servername + '' -i '' + @path

EXEC xp_cmdshell  @query

set @query = ''del ''  + @path

exec xp_cmdshell @query

drop table ' + @database + '._.' + @table + '

select * into ' + @database + '._.' + @table + ' from Test 

drop table query
drop table Test  ')

समाप्त


एसक्यूएल एंटरप्राइज मैनेजमेंट स्टूडियो में, अपनी मेज खोलें, वह कॉलम जोड़ें जहां आप चाहते हैं, और फिर - परिवर्तन सहेजने के बजाय - परिवर्तन स्क्रिप्ट उत्पन्न करें आप देख सकते हैं कि एसक्यूएल में यह कैसे किया जाता है।

संक्षेप में, जो अन्य ने कहा है वह सही है। एसक्यूएल प्रबंधन स्टूडियो आपके सभी डेटा को अस्थायी तालिका में खींचती है, तालिका ड्रॉप जाता है, इसे सही क्रम में कॉलमों के साथ पुन: बनाता है, और अस्थायी तालिका डेटा को वहां वापस रखता है एक विशिष्ट स्थिति में एक कॉलम जोड़ने के लिए कोई सरल सिंटैक्स नहीं है।







alter-table