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

时间:2015-03-16 19:54:34

标签: sql sql-server tsql

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

例如

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

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

1 个答案:

答案 0 :(得分: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