9

スクリプトを使用して、既存のデータベース構造を varchar から nvarchar に更新する必要がある状況にあります。このスクリプトは構成アプリケーションが実行されるたびに実行されるため、列が既に nvarchar に変更されているかどうかを判断し、テーブルに対して変更を実行しないようにします。サポートしなければならないデータベースは、SQL Server 2000、2005、および 2008 です。

4

5 に答える 5

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'

ただし、いくつかの簡単な注意事項があります。

  1. これはテーブルのみを行います。すべての sproc と関数をスキャンして、それらも変更されていることを確認する必要がありNVARCHARます。
  2. 4000 を超える場合は、次のようVARCHARに変更する必要があります。NVARCHAR(MAX)

しかし、それらはこのテンプレートで簡単に実行できるはずです。

これを自動的に実行したい場合は、WHILE句で設定できます。

于 2008-10-07T20:11:02.890 に答える
4

Josefの答えの問題は、クエリの実行後にNOT NULLフィールドが変更されることです。NULL次の操作で修正されます。

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

イゴールの答えへのクレジット

于 2015-08-05T08:19:46.823 に答える
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
于 2008-10-07T19:41:37.630 に答える
2

スペースの問題を修正し、スキーマを追加しました

SELECT 'ALTER TABLE [' + isnull(schema_name(syo.object_id), sysc.name) + '].[' +  syo.name 
    + '] ALTER COLUMN ' + syc.name + ' NVARCHAR(' + case syc.max_length when -1 then 'MAX' 
        ELSE convert(nvarchar(10),syc.max_length) end + ');'
   FROM sys.objects syo
   JOIN sys.columns syc ON
     syc.object_id= syo.object_id
   JOIN sys.types syt ON
     syt.system_type_id = syc.system_type_id
    JOIN sys.schemas sysc ON
    syo.schema_id=sysc.schema_id
   WHERE 
     syt.name = 'varchar' 
    and syo.type='U'
于 2012-11-20T07:31:05.430 に答える