由于存储来自语言特定的变音符(西班牙语,法语,德语)的值,我试图将列的数据类型更改为Unicode数据类型。
- Varchar到Varchar
- char到nchar
所以所有的列数据类型为其各自的Unicode数据类型。
指定数据库中的所有表。
可以在单个语句中完成吗?因为处理alter
语句非常耗时。
ALTER TABLE dbo.Employee
ALTER COLUMN FirstName NVARCHAR(255) NOT NULL
许多谢谢。
首先,我们创建一个临时表,并定义更改所需的变量。
然后我们通过获取需要更改的列来填充表。我输入了下面的获取命令,一切都清楚了。
然后,对于表中的每一行,我们在数据库中进行所需的更改。
同样,表中的列可能具有NULL
的值,因此必须在更改列之前将NULL
的值替换为值。我将NULL
的值替换为0
的值。
下面的代码完全正确地工作。
我只在schema name
中输入dbo
来查找列。查看数据库模式名称
--Container to Insert Id which are to be iterated
Declare @temp1 Table
(
tablename varchar(100),
columnname varchar(100),
columnlength varchar(100),
columntype varchar(100)
)
--Container to Insert records in the inner select for final output
Insert into @temp1
SELECT t.TABLE_NAME,c.COLUMN_NAME,c.CHARACTER_MAXIMUM_LENGTH,c.DATA_TYPE FROM information_schema.tables t
join INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME = c.TABLE_NAME
WHERE t.table_schema='dbo'
and (DATA_TYPE = 'varchar' OR DATA_TYPE = 'char')
-- Keep track of @temp1 record processing
Declare @tablename varchar(100)
Declare @columnname varchar(100)
Declare @columnlength varchar(100)
Declare @columntype varchar(100)
Declare @SQL VarChar(1000)
Declare @vary varchar(100)
Declare @final varchar(1000)
While((Select Count(*) From @temp1)>0)
Begin
Set @tablename=(Select Top 1 tablename From @temp1)
Set @columnname=(Select Top 1 columnname From @temp1)
Set @columnlength=(Select Top 1 columnlength From @temp1)
Set @columntype=(Select Top 1 columntype From @temp1)
if(@columntype = 'varchar')
Set @columntype='nvarchar'
else
Set @columntype='nchar'
--set null value with 0 value
SELECT @SQL = 'UPDATE ' + @tablename + ' SET ' + @columnname + ' = 0 WHERE ' + @columnname + ' IS NULL'
Exec ( @SQL)
SELECT @SQL = 'ALTER TABLE '
SELECT @SQL = @SQL + @tablename
select @vary = ' ALTER COLUMN ' + @columnname + ' ' + @columntype + '(' + @columnlength + ') NOT NULL'
select @final = @sql + @vary
--select @final
Exec ( @final)
Delete @temp1 Where tablename=@tablename and columnname = @columnname
End