如何将列的数据类型与给定的数据类型进行比较

How to compare datatype of column to a given datatype

我需要创建一个 SQL 更改脚本来检查列的特定数据类型并编辑数据类型(如果该列属于该类型)。

例如

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

如果 'Table' 中的 'Xml' 列的类型为 Xml,我希望上面的代码 return 为真。我需要将其更改为 varchar(max).

对于此类脚本,我使用 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