Product:
Microsoft SQL Azure server
Issue:
Need to change a column to have nvarchar(20) instead of nvarchar(200). How change nvarchar in table?
Solution:
Check the data length in the column (nvarchar is unicode, that uses 2 bytes for a single character):
SELECT DATALENGTH(Column_Name) AS FIELDSIZE, Column_Name FROM Table_Name ORDER by FIELDSIZE DESC
Change the columns value with:
Update Table_Name set Column_Name = left(coalesce(Column_Name ,''),20); Alter table Table_Name alter column Column_Name nvarchar(20) not null;
If you have constrains, you need to drop them first. DROP INDEX index_name ON table_name ;
https://www.w3schools.com/sql/sql_ref_drop_constraint.asp
Otherwise, rename the table;
sp_rename 'old_table_name', 'new_table_name'
Creata a new table with the old name, in SSMS you select the table and from menu select “Script table as” – create to – new query editor window. Adjust the code to have the new nvarchar value, example below:
CREATE TABLE [dbo].[table2](
[index] [int] NOT NULL,
[Name] [nvarchar](20) NULL,
[Country] [nvarchar](50) NULL,
[Employess] [int] NULL
) ON [PRIMARY]
Copy the data over to the new table
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;
For above table the example is as below, the left(coalesce([Name] ,”),20) make that we only copy the 20 first characters.
insert into table2 ( [index],[Name] ,[Country] ,[Employess]) select [index] ,left(coalesce([Name] ,''),20) ,[Country] ,[Employess] from table1
If you not use the LEFT function you may get a error like “String or binary data would be truncated”.
More Information:
https://www.sqlservertutorial.net/sql-server-basics/sql-server-nvarchar/
How to rename tables in SQL Server with the sp_rename command
https://www.w3schools.com/sql/sql_insert_into_select.asp
https://www.tutorialrepublic.com/sql-tutorial/sql-cloning-tables.php
https://www.w3schools.com/sql/sql_ref_insert_into_select.asp
https://www.w3schools.com/sql/func_sqlserver_left.asp
As index is a reserved command in SQL, you need to have it inside [ ] for SQL to understand it is a table name.