SQL Server - 用于将数据库列从varchar更新为nvarchar的脚本(如果尚未nvarchar)

Mic*_*lle 9 sql-server alter-table

我遇到的情况是我必须使用脚本将现有的数据库结构从varchar更新为nvarchar.由于每次运行配置应用程序时都会运行此脚本,因此我宁愿确定列是否已更改为nvarchar而不是对表执行alter.我必须支持的数据库是SQL Server 2000,2005和2008.

Jos*_*sef 26

您可以运行以下脚本,它将为您提供一组ALTER命令:

SELECT 'ALTER TABLE ' + isnull(schema_name(syo.id), 'dbo') + '.' +  syo.name 
    + ' ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.length when -1 then 'MAX' 
        ELSE convert(nvarchar(10),syc.length) end + ');'
   FROM sysobjects syo
   JOIN syscolumns syc ON
     syc.id = syo.id
   JOIN systypes syt ON
     syt.xtype = syc.xtype
   WHERE 
     syt.name = 'varchar' 
    and syo.xtype='U'
Run Code Online (Sandbox Code Playgroud)

但是,对你来说有几个快速的警告.

  1. 这只会做表格.您将要扫描所有的sprocs和函数,以确保它们也被更改NVARCHAR为.
  2. 如果您有VARCHAR> 4000,则需要将其修改为NVARCHAR(MAX)

但是这些模板应该很容易实现.

如果您希望自动运行,可以在WHILE子句中设置它.

  • 请注意这一点,因为您将获得新列的所有默认值.例如,非null varchar将被创建为可空的nvarchar. (4认同)

Pet*_*ter 2

以下查询应该可以满足您的需求:

IF EXISTS 
  (SELECT *
   FROM sysobjects syo
   JOIN syscolumns syc ON
     syc.id = syo.id
   JOIN systypes syt ON
     syt.xtype = syc.xtype
   WHERE 
     syt.name = 'nvarchar' AND
     syo.name = 'MY TABLE NAME' AND
     syc.name = 'MY COLUMN NAME')
BEGIN
   ALTER ...
END
Run Code Online (Sandbox Code Playgroud)