admin

如何在不默认为null的情况下将db object数据类型从varchar更改为nvarchar?

sql

我有一些表,存储过程和函数使用,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。

请给我一个安全的解决方案。


阅读 257

收藏
2021-06-07

共1个答案

admin

只需添加

+ CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END

另外,您需要添加CHARACTER_MAXIMUM_LENGTHnvarchar

至于存储过程中的参数,我最好手动进行。

编辑
完整查询

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
2021-06-07