如何将db对象数据类型从varchar更改为nvarchar而不将默认值设置为null?

时间:2015-07-29 04:53:50

标签: sql sql-server database

我使用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,这是一个问题。我需要将nullable保留为可空,不可为空为nullable。

接下来,问题是我必须手动编辑存储过程和函数,以便在需要时实现此更改。是否有一些解决方法脚本可以安全地更改参数?

请注意,数据库中没有视图,而且某些varchar声明的大小也是8000。

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

1 个答案:

答案 0 :(得分:4)

添加

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

此外,您需要将CHARACTER_MAXIMUM_LENGTH添加到nvarchar

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

已审核
完整查询

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