Арнайы бағаннан кейін TSQL бағанын қалай қосу керек?

Менің үстелім бар:

MyTable
    ID
    FieldA
    FieldB

Кестені өзгертіп, бағанды ​​қосқым келеді:

MyTable
    ID
    NewField
    FieldA
    FieldB

MySQL-те мынаған болар едім:

ALTER TABLE MyTable ADD COLUMN NewField int NULL AFTER ID;

Бір жол, жақсы, қарапайым, жақсы жұмыс істейді. Мұны Microsoft корпорациясының әлемінде қалай жасауға болады?

24
Sys.columns кестесіндегі column_id өрісі емес пе (sql сервері)?
қосылды автор ganders, көзі
қосылды автор JNK, көзі

9 жауаптар

Өкінішке орай, сіз алмайсыз.

Егер сіз оларды шынымен де осы тәртіпте алғыңыз келсе, сол тәртіпте бағандармен жаңа кесте жасауыңыз және деректерді көшіруіңіз керек. Немесе бағандарды қайта атаңыз. Оңай жол жоқ.

24
қосылды
Басқару студиясында бағанды ​​ғана апарасыз. Бұл өте оңай
қосылды автор paparazzo, көзі
@ PreguntonCojoneroCabrón басқару студиясы деректерді кестеге деструктивті өзгерту қажет болса, оны уақытша орынға көшіру мағынасында қолдайды. Кестенің ішінде белгілі бір тәртіпте бағанды ​​қою осындай кестедегі кестені тастау және қалпына келтіру қажет болатын бір операция болып табылады. SSMS деректерді көшіреді, кестені түсіреді, кестені жаңа схемамен қайта жасайды, содан кейін деректерді кестеге қосады.
қосылды автор squillman, көзі
@Peter Management Studio басқарады деректер ?
қосылды автор PreguntonCojoneroCabrón, көзі
Басқару студиясы сізге кестені бұзып, қайта жасай алады, бірақ сізде өте көп, өте үлкен кесте бар болса, онда оны өзгерту керек. Кестені бұзбастан мұны істеуге болатын болса, жақсы болар еді. Басқару студиясында сіз бұл әрекетті тоқтатуға мүмкіндік беріп отырсыз, себебі бұл уақыт өте көп болуы мүмкін.
қосылды автор Peter, көзі

шешім:

Бұл кестелерде жұмыс істейді, онда кестедегі тәуелділіктер болмайды, бұл каскадты оқиғаларды тудыруы мүмкін. Алдымен, кестеңізбен байланысты барлық тәуелділіктер мен баған шектеулеріне назар аударыңыз (мысалы, триггерлер, индекстер) және т.б.). Аяқтағаннан кейін, оларды кері қайтару қажет болуы мүмкін.

STEP 1: create the temp table to hold all the records from the table you want to restructure. Do not forget to include the new column.

CREATE TABLE #tmp_myTable
(   [new_column] [int] NOT NULL, <-- new column has been inserted here!
    [idx] [bigint] NOT NULL,
    [name] [nvarchar](30) NOT NULL,
    [active] [bit] NOT NULL
)

STEP 2: Make sure all records have been copied over and that the column structure looks the way you want.

SELECT TOP 10 * FROM #tmp_myTable ORDER BY 1 DESC -- you can do COUNT(*) or anything to make sure you copied all the records

STEP 3: DROP the original table:

DROP TABLE myTable

Егер сіз жаман нәрселер туралы параноид болсаңыз, түпнұсқалық кестені қайта атаңыз (оның орнына оны тастаңыз). Осылайша, оны әрдайым қайтаруға болады.

EXEC sp_rename myTable, myTable_Copy

STEP 4: Recreate the table myTable the way you want (should match match the #tmp_myTable table structure)

CREATE TABLE myTable
(   [new_column] [int] NOT NULL,
    [idx] [bigint] NOT NULL,
    [name] [nvarchar](30) NOT NULL,
    [active] [bit] NOT NULL
)

- қажет болуы мүмкін шектеулерді ұмытпаңыз

STEP 5: Copy the all the records from the temp #tmp_myTable table into the new (improved) table myTable.

INSERT INTO myTable ([new_column],[idx],[name],[active])
SELECT [new_column],[idx],[name],[active]
FROM #tmp_myTable

6-ҚАДАМ: Барлық деректердің жаңа, жетілдірілген кестеде myTable . Егер болса, өзіңізді тазалап, оны өшірмей, оны қайта атауды таңдасаңыз, #tmp_myTable және myTable_Copy кестесін DROP етіп тазалаңыз.

4
қосылды

Басқару студиясында GUI арқылы бағанды ​​жасасаңыз, мұны істеуіңіз керек. Менеджмент студиясы шын мәнінде үстелді толығымен жаңартады деп ойлаймын, сондықтан бұл орын алуы мүмкін.

Басқалар айтқандай, кестедегі бағандардың тәртібі маңызды емес, ал егер бұл сіздің кодыңызда қате нәрсе болса.

3
қосылды

/*   Кестенің баған тәртібін өзгерту үшін сценарий
  Назар аударыңыз, бұл түпнұсқа кестені ауыстыру үшін жаңа кесте жасайды   Дегенмен, бұл триггерлер немесе басқа кесте сипаттарын - тек деректерді көшірмейді   */

Сізге қажет кестеде бағандармен жаңа кестені жасаңыз

Column2, Column1, Column3 таңдаңыз NewTable в OldTable

Бастапқы кестені жою

Drop Table OldTable;

Жаңа кестенің атын өзгерту

EXEC sp_rename «NewTable», «OldTable»;

2
қосылды

Microsoft SQL Server басқару студиясында (MSSQL үшін әкімшілік құралы) жай кестеде «дизайнға» өтіп, бағанды ​​жаңа орынға апарыңыз. Командалық жол емес, бірақ оны жасай аласыз.

1
қосылды

Кестені қайта құру қажет. Бақытымызға орай, бағандардың тәртібі мүлдем маңызды емес!

Мен сіздің бағандарды сиқырлы түрде қайта реттеген кезде қараңыз:

SELECT ID, Newfield, FieldA, FieldB FROM MyTable

Сондай-ақ бұл туралы бислон рет еске алды.

1
қосылды
жақсы, егер мен SQL арқылы тікелей қол жеткізген болсам, мүмкін емес, бірақ мен жоқпын. Сондай-ақ, барлық кестелерімнің бірдей орнатылуын қалаймын (жаңартулар және жаңадан жасалған).
қосылды автор Justin808, көзі
Басқару студиясында баған тәртібі пайда болады. Үлкен кестелерде конгресс үшін маңызды болуы мүмкін.
қосылды автор Peter, көзі

SQL Enterprise Management Studio бағдарламасында кестеңізді ашыңыз, қажет бағанды ​​қосыңыз, содан кейін - өзгерісті сақтаудың орнына - өзгерту сценарийін жасаңыз. SQL-де қалай жасалғанын көре аласыз.

Қысқасы, басқалардың айтқандары дұрыс. SQL Management студиясы барлық деректерді уақытша кестеге шығарады, кестені түсіріп, бағандармен дұрыс тәртіпте қайта жасайды және бұл жерде уақытша кесте деректерін қайтадан қояды. Арнайы орынға бағанды ​​қосудың қарапайым синтаксисі жоқ.

1
қосылды

Сұрақ ескі болса да, Басқару студиясы туралы дәлірек талап етіледі.

Бағанды ​​қолмен немесе басқару студиясында жасауға болады. Бірақ Басқару студиясы кестені қайта жасауды қажет етеді және кесте жарық болғанша аулақ болуыңыз керек, егер сізде тым көп деректер бар болса, уақытты алып тастайды.

Бағандардың тәртібін өзгерту үшін жай ғана оларды Басқару студиясында жылжыту керек. Бұл талап етілмейді (Exceptions бар, ең алдымен бар), бұл Management Studio кестені қайта жасауы мүмкін, себебі ол кестенің анықтамаларында бағандардың орнын өзгертеді.

Мен мұны бірнеше рет кестелермен жасадым, олардағы деректерге байланысты GUI бағандарын қоса алмадым. Содан кейін бағандарды басқару студиясының GUI-ге жылжытып, оларды жай ғана сақтады.

Сіз күткен уақыттан бастап күтудің бірнеше секундына дейін барасыз.

0
қосылды

Бұл мүлдем мүмкін. Сіз өзіңіздің немен айналысып жатқаныңызды білмейінше оны жасамауға тиіссіз. Оны түсіну үшін шамамен 2 күнді алдым. Мұнда енгізілетін сақталатын рәсім: --- дерекқор атауы (схема атауы - «readability» үшін «_») --- кесте атауы --- баған --- бағанның деректер түрі (қосылған баған әрдайым нөлге тең, әйтпесе сіз кірістіре алмайсыз) --- жаңа бағанның орны.

Since I'm working with tables from SAM toolkit (and some of them have > 80 columns) , the typical variable won't be able to contain the query. That forces the need of external file. Now be careful where you store that file and who has access on NTFS and network level.

Көңілділер!

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'')
СОҢЫ

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'')
        СОҢЫ
        else
        begin
            set @printVars += '' print convert(varchar(50),@'' + @oldC + '')'' 
            set @columnsDecl += ''@'' + @oldC + '' '' + @oldCDataType + '', '' 
            exec(''alter table Test add ['' + @oldC + ''] '' + @oldCDataType + '' null'')
        СОҢЫ
    СОҢЫ
    else
    begin 
        if(@oldCLen < 0)
        begin
            set @oldCLen = 4000
        СОҢЫ
        set @printVars += '' print @'' + @oldC 
        set @columnsDecl += ''@'' + @oldC + '' '' + @oldCDataType + ''('' + convert(character,@oldCLen) + '') , '' 
        exec(''alter table Test add ['' + @oldC + ''] '' + @oldCDataType + ''('' + @oldCLen + '') null'')
    СОҢЫ
СОҢЫ

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

FETCH NEXT FROM MY_CURSOR INTO  @oldC, @oldCDataType, @oldCLen, @oldCPos СОҢЫ 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 + '' СОҢЫ 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  ')

СОҢЫ

0
қосылды
Бұл процедура туралы жақсартуға болатын нәрсе - жаңа бағанға әдепкі мәнді қоса аласыз, содан кейін ескі бағандарды екі бөлікке бөлуге болады: жаңа бағанға дейін және кейін. Мәндерді енгізген кезде, кірістірудің таңдалған нұсқасында '@beforeColumn + default + @after column' қосылады. Егер бар болса, қосымша жақсартуларды ұсыныңыз :)
қосылды автор Zlatin Todorinski, көзі