티스토리 뷰

다음 쿼리를 통해 필요한 정보를 얻을 수 있습니다.

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
                                          
-------------------

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. VARCHAR4000이 넘는 경우 수정해야합니다.NVARCHAR(MAX)

하지만이 템플릿으로 쉽게 할 수 있어야합니다.

이것이 자동으로 실행되도록하려면 WHILE에서 설정할 수 있습니다 .

-------------------

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
          

Igor의 답변에 대한 크레딧

-------------------

공간 문제 수정 및 스키마 추가

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'
                                                   
-------------------

MAX가 -1로 대체되는 문제를 추가로 업데이트했습니다.

SELECT cmd = 'ALTER TABLE [' + c.table_schema + '].[' + c.table_name 
 + '] ALTER COLUMN [' + c.column_name + '] NVARCHAR('
  +CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000 THEN 
   CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
    'MAX' ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) END 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
     

Nezam의 답변에 대한 크레딧

그리고 기본값을 관리하는 또 다른 방법 :

SELECT cmd = 
CASE WHEN name IS NOT NULL THEN
    'ALTER TABLE ' + c.table_name + ' DROP CONSTRAINT ' + d.name + '; ' +
        'ALTER TABLE [' + c.table_schema + '].[' + c.table_name + '] ALTER COLUMN [' + c.column_name + '] ' + 
            'NVARCHAR(' +
                CASE WHEN CHARACTER_MAXIMUM_LENGTH <= 4000 THEN 
                        CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
                                    'MAX' 
                                            ELSE 
                                                        CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) 
                                                                END 
                                                                     ELSE 
                                                                             'MAX' 
                                                                                 END 
                                                                                     + ')' +
                                                                                         CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END + '; ' + 
                                                                                             'ALTER TABLE '+ c.table_name + ' ADD CONSTRAINT ' + d.name +' DEFAULT '+ c.column_default + ' FOR ' + c.column_name + ';'
                                                                                             ELSE
                                                                                                 'ALTER TABLE [' + c.table_schema + '].[' + c.table_name + '] ALTER COLUMN [' + c.column_name + '] ' +
                                                                                                     'NVARCHAR(' +
                                                                                                         CASE WHEN CHARACTER_MAXIMUM_LENGTH<=4000 THEN
                                                                                                                 CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN
                                                                                                                             'MAX' 
                                                                                                                                     ELSE 
                                                                                                                                                 CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) 
                                                                                                                                                         END 
                                                                                                                                                             ELSE 
                                                                                                                                                                     'MAX' 
                                                                                                                                                                         END
                                                                                                                                                                             + ')' +
                                                                                                                                                                                 CASE WHEN IS_NULLABLE='NO' THEN ' NOT NULL' ELSE '' END 
                                                                                                                                                                                 END,d.name, c.*
                                                                                                                                                                                 FROM information_schema.columns c
                                                                                                                                                                                 LEFT OUTER JOIN sys.default_constraints d ON d.parent_object_id = object_id(c.table_name)
                                                                                                                                                                                 AND d.parent_column_id = columnproperty(object_id(c.table_name), c.column_name, 'ColumnId')
                                                                                                                                                                                 WHERE c.data_type='VARCHAR' 
                                                                                                                                                                                 ORDER BY CHARACTER_MAXIMUM_LENGTH DESC
                                                                                                                                                                                 


출처
https://stackoverflow.com/questions/180022
댓글
공지사항
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31