এসকিউএল সার্ভারে একবারে একাধিক কলাম কীভাবে পরিবর্তন করবেন


143

আমার ALTERএকটি টেবিলের বিভিন্ন ধরণের কলামের ডেটা ধরণের দরকার ।

একটি কলামের জন্য, নিম্নলিখিতটি সূক্ষ্মভাবে কাজ করে:

ALTER TABLE tblcommodityOHLC
ALTER COLUMN
    CC_CommodityContractID NUMERIC(18,0) 

তবে আমি কীভাবে এক বিবৃতিতে একাধিক কলাম পরিবর্তন করতে পারি? নিম্নলিখিতগুলি কাজ করে না:

ALTER TABLE tblcommodityOHLC
ALTER COLUMN
    CC_CommodityContractID NUMERIC(18,0), 
    CM_CommodityID NUMERIC(18,0)

1
একসাথে এটি করার জন্য অনুভূত সুবিধা কী?
onedaywhen

5
@ এমনেডেউহেন - যাতে এসকিউএল সার্ভারটি নতুন ডেটাটাইপের বিপরীতে এবং / অথবা পরিবর্তিত কলামগুলি নতুন ফর্ম্যাটে লেখার জন্য প্রয়োজনীয় টেস্টের জন্য টেবিলটি দিয়ে কেবল একটি পাস করে।
মার্টিন স্মিথ

1
কোন দুর্দান্ত সুবিধা!
onedaywhen

4
বিপরীত। বড় টেবিলগুলিতে একাধিক কলামের জন্য 24 এর পরিবর্তে 2 ঘন্টার মধ্যে একটি পরিবর্তক রান করা একটি দুর্দান্ত সুবিধা হবে।
নরবার্ট কার্ডোস

উত্তর:


135

যদি সম্ভব না হয়. এটি আপনাকে একে একে করতে হবে।

আপনি আপনার সংশোধিত কলামগুলিতে একটি অস্থায়ী সারণী তৈরি করতে পারেন, তথ্য জুড়ে অনুলিপি করতে পারেন, আপনার মূল টেবিলটি ফেলে দিতে পারেন এবং আপনার অস্থায়ী সারণির নামটি আপনার মূল নামে রাখতে পারেন।


5
+1, You will need to do this one by one.সুতরাং, বড় বিষয় কী, কেবল একাধিক ALTER TABLE ALTER COLUMNআদেশ ব্যবহার করবেন ?
কেএম

6
@ কেএম একটি সমস্যা হ'ল যদি আপনি একটি বড় টেবিল পরিবর্তন করেন। প্রতিটি বিবৃতি মানে একটি নতুন স্ক্যান তবে আপনি যদি একাধিক কলাম পরিবর্তন করতে পারতেন তবে সমস্ত পরিবর্তনটি আরও দ্রুততর হতে পারে
এরিকালকালেন

@ এরিক্ক্যালেন, তারপরে এসএসএমএস সরঞ্জামগুলি সাধারণত তাদের স্ক্রিপ্টগুলি তৈরি করে: একটি নতুন টেবিল তৈরি করে এফকে এবং সূচিপত্রগুলি ইত্যাদির প্রতিলিপি করুন, মূল টেবিলটি ফেলে দিন এবং নতুন টেবিলটির নামকরণ করুন
কেএম।

টেবিলগুলি ফেলে দেওয়া এবং পুনরুদ্ধার করা একটি দুর্দান্ত নিবিড় ক্রিয়াকলাপ। এটি এখন এসএসএমএসে ডিফল্টরূপে অক্ষম এবং সম্ভবত সঙ্গত কারণেই।
জোকুল

"Each statement means a new scan": অগত্যা @ এরিক্কাল্লেন নয়। কিছু ক্ষেত্রে ALTER কলামটি একটি সাধারণ মেটাডেটা পরিবর্তন। আগামীকাল " SQL Internals - Physical Table Structure under the hood, and implementation on real case scenarios" সম্পর্কে
সমস্তটি

26

ALTER COLUMNএকক ALTER TABLEবিবৃতিতে একাধিক ক্রিয়া করা সম্ভব নয়।

দেখুন ALTER TABLEসিনট্যাক্স এখানে

আপনি একাধিক ADDবা একাধিক করতে পারেন DROP COLUMNতবে কেবল একটি ALTER COLUMN


17

অন্যরা যেমন উত্তর দিয়েছে, আপনার একাধিক ALTER TABLEবক্তব্য দরকার ।
নিম্নলিখিত চেষ্টা করুন:

ALTER TABLE tblcommodityOHLC alter column CC_CommodityContractID NUMERIC(18,0);
ALTER TABLE tblcommodityOHLC alter column CM_CommodityID NUMERIC(18,0);

12

নীচের সমাধানটি একাধিক কলাম পরিবর্তন করার জন্য একক বিবৃতি নয়, তবে হ্যাঁ, এটি জীবনকে সহজ করে তোলে:

  1. একটি টেবিলের CREATEস্ক্রিপ্ট তৈরি করুন ।

  2. প্রথম লাইনের CREATE TABLEসাথে প্রতিস্থাপন করুনALTER TABLE [TableName] ALTER COLUMN

  3. তালিকা থেকে অযাচিত কলামগুলি সরান।

  4. আপনার পছন্দ অনুযায়ী কলামগুলির ডেটা প্রকারগুলি পরিবর্তন করুন।

  5. নিম্নলিখিত হিসাবে একটি অনুসন্ধান করুন এবং প্রতিস্থাপন করুন :

    1. খুঁজুন: NULL,
    2. প্রতিস্থাপন: NULL; ALTER TABLE [TableName] ALTER COLUMN
    3. হিট রিপ্লেস বাটন।
  6. স্ক্রিপ্ট চালান।

আশা করি এতে প্রচুর সময় সাশ্রয় হবে :))


6

অন্য অনেক লোক যেমন বলেছে, আপনাকে একাধিক ALTER COLUMNবিবৃতি ব্যবহার করতে হবে , প্রতিটি কলামের জন্য একটি আপনি সংশোধন করতে চান।

আপনি যদি নিজের টেবিলের সমস্ত বা বেশ কয়েকটি কলাম একই ড্যাট্যাটাইপ (যেমন একটি ভ্রচার ক্ষেত্রটি 50 থেকে 100 অক্ষরে প্রসারিত করা) করতে চান তবে নীচের ক্যোয়ারীটি ব্যবহার করে আপনি সমস্ত বিবৃতি স্বয়ংক্রিয়ভাবে তৈরি করতে পারেন। আপনি একাধিক ক্ষেত্রে একই অক্ষরটি প্রতিস্থাপন করতে চাইলে এই কৌশলটিও দরকারী (

SELECT
     TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,COLUMN_NAME
    ,'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ALTER COLUMN ['+COLUMN_NAME+'] VARCHAR(300)' as 'code'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table' AND TABLE_SCHEMA = 'your_schema'

এটি আপনার ALTER TABLEজন্য প্রতিটি কলামের জন্য একটি বিবৃতি উত্পন্ন করে ।


1

আপনি যদি ম্যানেজমেন্ট স্টুডিওতে পরিবর্তনগুলি করেন এবং স্ক্রিপ্টগুলি উত্পন্ন করেন তবে এটি একটি নতুন সারণী তৈরি করে এবং পরিবর্তিত ডেটা ধরণের সাথে পুরানো ডেটা .োকায়। দুটি কলামের ডেটা ধরণের পরিবর্তন করে এখানে একটি ছোট উদাহরণ

/*
   12 August 201008:30:39
   User: 
   Server: CLPPRGRTEL01\TELSQLEXPRESS
   Database: Tracker_3
   Application: 
*/

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
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
GO
ALTER TABLE dbo.tblDiary
    DROP CONSTRAINT FK_tblDiary_tblDiary_events
GO
ALTER TABLE dbo.tblDiary_events SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_tblDiary
    (
    Diary_ID int NOT NULL IDENTITY (1, 1),
    Date date NOT NULL,
    Diary_event_type_ID int NOT NULL,
    Notes varchar(MAX) NULL,
    Expected_call_volumes real NULL,
    Expected_duration real NULL,
    Skill_affected smallint NULL
    )  ON T3_Data_2
     TEXTIMAGE_ON T3_Data_2
GO
ALTER TABLE dbo.Tmp_tblDiary SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_tblDiary ON
GO
IF EXISTS(SELECT * FROM dbo.tblDiary)
     EXEC('INSERT INTO dbo.Tmp_tblDiary (Diary_ID, Date, Diary_event_type_ID, Notes, Expected_call_volumes, Expected_duration, Skill_affected)
        SELECT Diary_ID, Date, Diary_event_type_ID, CONVERT(varchar(MAX), Notes), Expected_call_volumes, Expected_duration, CONVERT(smallint, Skill_affected) FROM dbo.tblDiary WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_tblDiary OFF
GO
DROP TABLE dbo.tblDiary
GO
EXECUTE sp_rename N'dbo.Tmp_tblDiary', N'tblDiary', 'OBJECT' 
GO
ALTER TABLE dbo.tblDiary ADD CONSTRAINT
    PK_tblDiary PRIMARY KEY NONCLUSTERED 
    (
    Diary_ID
    ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2

GO
CREATE UNIQUE CLUSTERED INDEX tblDiary_ID ON dbo.tblDiary
    (
    Diary_ID
    ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2
GO
CREATE NONCLUSTERED INDEX tblDiary_date ON dbo.tblDiary
    (
    Date
    ) WITH( PAD_INDEX = OFF, FILLFACTOR = 86, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON T3_Data_2
GO
ALTER TABLE dbo.tblDiary WITH NOCHECK ADD CONSTRAINT
    FK_tblDiary_tblDiary_events FOREIGN KEY
    (
    Diary_event_type_ID
    ) REFERENCES dbo.tblDiary_events
    (
    Diary_event_ID
    ) ON UPDATE  CASCADE 
     ON DELETE  CASCADE 

GO
COMMIT

1

আপনি যদি পুরো জিনিসটি নিজে লিখতে না চান এবং সমস্ত কলামগুলিকে একই ডেটাটাইপে পরিবর্তন করতে চান এটি এটি আরও সহজ করে তুলতে পারে:

select 'alter table tblcommodityOHLC alter column '+name+ 'NUMERIC(18,0);'
from syscolumns where id = object_id('tblcommodityOHLC ')

আপনি আপনার জিজ্ঞাসা হিসাবে আউটপুট অনুলিপি এবং আটকান করতে পারেন


0
select 'ALTER TABLE ' + OBJECT_NAME(o.object_id) + 
    ' ALTER COLUMN ' + c.name + ' DATETIME2 ' + 
    CASE WHEN c.is_nullable = 0 THEN 'NOT NULL' ELSE 'NULL' END
from sys.objects o
inner join sys.columns c on o.object_id = c.object_id
inner join sys.types t on c.system_type_id = t.system_type_id
where o.type='U'
and c.name = 'Timestamp'
and t.name = 'datetime'
order by OBJECT_NAME(o.object_id)

ডেভির সৌজন্যে


0

ইভানের কোড নমুনায় ধন্যবাদ, আমি এটিকে আরও সংশোধন করতে এবং সারণীর সাথে আরও নির্দিষ্ট করে নির্দিষ্ট কলামের নাম এবং সীমাবদ্ধতার জন্য নির্দিষ্ট হ্যান্ডেলগুলি পেতে সক্ষম হয়েছি। আমি সেই কোডটি চালিয়েছি এবং তারপরে [CODE] কলামটি অনুলিপি করেছি এবং তা ছাড়াই এটি সম্পাদন করেছি exec

USE [Table_Name]
GO
SELECT
     TABLE_CATALOG
    ,TABLE_SCHEMA
    ,TABLE_NAME
    ,COLUMN_NAME
    ,DATA_TYPE
    ,'ALTER TABLE ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] DROP CONSTRAINT [DEFAULT_'+TABLE_NAME+'_'+COLUMN_NAME+']; 
ALTER TABLE  ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ALTER COLUMN ['+COLUMN_NAME+'] datetime2 (7) NOT NULL 
ALTER TABLE  ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] ADD CONSTRAINT [DEFAULT_'+TABLE_NAME+'_'+COLUMN_NAME+'] DEFAULT (''3/6/2018 6:47:23 PM'') FOR ['+COLUMN_NAME+']; 
GO' AS '[CODE]'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE 'form_%' AND TABLE_SCHEMA = 'dbo'
 AND (COLUMN_NAME = 'FormInserted' OR COLUMN_NAME = 'FormUpdated')
 AND DATA_TYPE = 'datetime'

0
-- create temp table 
CREATE TABLE temp_table_alter
(
column_name varchar(255)    
);

-- insert those coulmns in temp table for which we nee to alter size of columns 
INSERT INTO temp_table_alter (column_name) VALUES ('colm1');
INSERT INTO temp_table_alter (column_name) VALUES ('colm2');
INSERT INTO temp_table_alter (column_name) VALUES ('colm3');
INSERT INTO temp_table_alter (column_name) VALUES ('colm4');

DECLARE @col_name_var varchar(255);
DECLARE alter_table_cursor CURSOR FOR
select column_name from temp_table_alter ;

OPEN alter_table_cursor
FETCH NEXT FROM alter_table_cursor INTO @col_name_var
WHILE @@FETCH_STATUS = 0
 BEGIN

 PRINT('ALTER COLUMN ' + @col_name_var);
 EXEC ('ALTER TABLE Original-table  ALTER COLUMN ['+ @col_name_var + '] DECIMAL(11,2);')

 FETCH NEXT FROM alter_table_cursor INTO @col_name_var
 END

CLOSE alter_table_cursor
DEALLOCATE alter_table_cursor

-- at the end drop temp table
drop table temp_table_alter;

একটি ভাল সমাধান না। সমস্ত খরচেই কার্সার এবং লুপগুলি এড়ানো উচিত !!!
রায় কে।

1
সত্য নয়, রে। নির্দিষ্ট ডিডিএল কার্য এবং অন্যান্য প্রয়োজনীয় আরবিআর কার্যক্রমে কার্সার এবং লুপগুলি ভাল।
জেফ মোডেন

-3

আমরা একক কোয়েরিতে একাধিক কলাম এই জাতীয় পরিবর্তন করতে পারি:

ALTER TABLE `tblcommodityOHLC`
    CHANGE COLUMN `updated_on` `updated_on` DATETIME NULL DEFAULT NULL AFTER `updated_by`,
    CHANGE COLUMN `delivery_datetime` `delivery_datetime` DATETIME NULL DEFAULT CURRENT_TIMESTAMP AFTER `delivery_status`;

কমা পৃথকীকৃত হিসাবে কেবল প্রশ্নগুলি দিন।


4
আমার মনে হয় এটি কি MySQL? প্রশ্নটি এসকিউএল সার্ভারের জন্য ছিল, এবং এটি
স্কিল

-4

ALTER COLUMNএকটি বন্ধনী ভিতরে বিবৃতি রাখুন , এটি কাজ করা উচিত।

ALTER TABLE tblcommodityOHLC alter ( column  
CC_CommodityContractID NUMERIC(18,0), 
CM_CommodityID NUMERIC(18,0) )

-4

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি নীচে উল্লিখিত ক্যোয়ারীটি ব্যবহার করে একটি সারণীতে একাধিক কলাম যুক্ত করতে পারেন।

প্রশ্ন:

Alter table tablename add (column1 dataype, column2 datatype);

4
ওপি ALTER কলাম সম্পর্কে জিজ্ঞাসা করেছিল, ADD নয়।
ডিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.