我有一些表,存储过程和函数使用,varchar但要支持阿拉伯文本,我需要将其更改为nvarchar。我有这个表的脚本
varchar
nvarchar
select cmd = 'alter table [' + c.table_schema + '].[' + c.table_name + '] alter column [' + c.column_name + '] nvarchar',* from information_schema.columns c where c.data_type='varchar' order by CHARACTER_MAXIMUM_LENGTH desc
使用此方法,我得到一个查询,可以复制粘贴并执行将varchar更改为nvarchar的查询,但是它们默认将不可为null的列默认为包含null,这是一个 大 问题。我需要将nullable保留为nullable,将non nullable保留为non nullable。
接下来,问题是我将不得不手动编辑存储过程和函数以在需要时实施此更改。是否有一些解决方法脚本可以至少安全地更改参数?
请注意,数据库中没有视图,某些varchar声明的大小也为8000。
请给我一个安全的解决方案。
只需添加
+ CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END
另外,您需要添加CHARACTER_MAXIMUM_LENGTH到nvarchar。
CHARACTER_MAXIMUM_LENGTH
至于存储过程中的参数,我最好手动进行。
编辑 完整查询
SELECT cmd = 'alter table [' + c.table_schema + '].[' + c.table_name + '] alter column [' + c.column_name + '] nvarchar(' +CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000 THEN CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10)) ELSE 'max' END+')' + CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END,* FROM information_schema.columns c WHERE c.data_type='varchar' ORDER BY CHARACTER_MAXIMUM_LENGTH desc