2015-03-16 6 views
1

Мне нужно создать скрипт изменения SQL, который проверяет конкретный тип данных столбца и редактирует тип данных, если столбец этого типа.Как сравнить тип данных столбца с данным типом данных

Например

IF (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'Table' AND COLUMN_NAME = 'Xml') = 'xml') 

Я хочу, чтобы приведенный выше код, чтобы вернуть истину, если столбец «Xml» в «таблице» имеет тип Xml. Мне нужно изменить его на varchar(max).

+0

Было бы безопаснее, если вы сделаете это так? Шаг 1: Найдите все столбцы с желаемым типом данных Шаг 2: Пройдите через каждый столбец и вручную обновите тип данных – Cam

+0

Мне нужно только изменить этот тип данных столбцов не все из них, у которых есть тип данных xml. – Chris

ответ

2

Для таких сценариев, которые я использую SQL Server metadata/catalog взгляды вместо взглядов из INFORMATION_SCHEMA:

Для нетипизированных столбцов XML:

IF EXISTS(
    SELECT * 
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id 
    JOIN sys.schemas s ON t.schema_id = s.schema_id 
    JOIN sys.types tp ON c.user_type_id = tp.user_type_id 
    WHERE s.name = N'dbo' 
    AND  t.name = N'Table1' 
    AND  c.name = N'Col2' 
    AND  tp.name= N'xml' 
) 
BEGIN 
    ALTER TABLE dbo.Table1 
    ALTER COLUMN ... 
END 

Для типизированных столбцов XML:

IF EXISTS(
    SELECT xmlcol.* 
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id 
    JOIN sys.schemas s ON t.schema_id = s.schema_id 
    JOIN sys.xml_schema_collections xmlcol ON c.xml_collection_id = xmlcol.xml_collection_id 
    JOIN sys.schemas xmlcols ON xmlcol.schema_id = s.schema_id 
    WHERE s.name = N'Production' 
    AND  t.name = N'ProductModel' 
    AND  c.name = N'Instructions' 
    AND  xmlcols.name = N'Production' 
    AND  xmlcol.name = N'ManuInstructionsSchemaCollection' 
) 
BEGIN 
    ALTER TABLE dbo.Table1 
    ALTER COLUMN ... 
END 

Примечание : Если бы я преобразовал значения XML в текст значения Я бы использовал NVARCHAR вместо VARCHAR.

+0

Спасибо! Эти два фрагмента являются одинаковыми. – Chris

+0

Я обновил свой ответ. –

+1

Спасибо! Нетипизированная версия работает отлично. – Chris

Смежные вопросы