ALTER COLUMN如果存在

时间:2013-12-31 15:03:14

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2

如果表中的列具有相同的数据类型且存在数字

,我想更改表

原始tTable结构

表名

ColumnName NVARCHAR(100)

如果ColumnName NVARCHAR且长度为100,则更改列的代码

IF EXISTS(...)
BEGIN
    ALTER TABLE [dbo].[TableName]
    ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END

我需要在IF EXISTS(...)插入哪些查询?

6 个答案:

答案 0 :(得分:3)

我个人总是选择SQL Server系统视图而不是INFORMATION_SCHEMA,原因为detailed by Aaron Bertrand。另外一个好处是,在这种情况下,您可以排除计算列,这些列只显示为表INFORMATION_SCHEMA.COLUMNS中的普通列。

IF EXISTS
    (   SELECT  1
        FROM    sys.columns c
                INNER JOIN sys.types t
                    ON t.system_type_id = c.system_type_id
                    AND t.user_type_id = c.user_type_id
        WHERE   c.name = 'ColumnName'
        AND     c.[object_id] = OBJECT_ID(N'dbo.TableName', 'U')
        AND     t.name = 'nvarchar'
        AND     c.max_length = 100
        AND     c.is_computed = 0
    )
    BEGIN
        ALTER TABLE [dbo].[TableName]
        ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
    END;

this SQL Fiddle所示,在使用信息架构方法时,您可能会尝试更改计算列并收到错误。

答案 1 :(得分:1)

IF EXISTS(SELECT 1 
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = 'TableName' AND TABLE_SCHEMA='dbo'
          AND COLUMN_NAME = 'ColumnName' AND DATA_TYPE = 'nvarchar'
          AND CHARACTER_MAXIMUM_LENGTH = 100)
BEGIN
ALTER TABLE [dbo].[TableName]
ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END

答案 2 :(得分:0)

SELECT column_name 'Column Name',
data_type 'Data Type',
CHARacter_maximum_length 'Maximum Length'
FROM information_schema.columns
WHERE table_name = 'TableName'

从这个你获取列名并以游标的形式输入,考虑每一行和进程休息

答案 3 :(得分:0)

试试这个

IF EXISTS (SELECT data_type FROM Information_Schema.Columns WHERE Table_Name = 'MyTable'
      AND Column_Name = 'MyColumn' AND data_type = 'NVARCHAR ' AND character_maximum_length =100)
BEGIN
ALTER TABLE [dbo].[TableName]
ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END

答案 4 :(得分:0)

我,我懒得输入所有那些系统表连接(更不用说INFORMATION_YADA模式),我只是使用元数据函数:

IF columnproperty(object_id('dbo.TableName'), 'ColumnName', 'ColumnId') is not null
 and columnproperty(object_id('dbo.TableName'), 'ColumnName', 'Precision') = 200
    ALTER...

我相信这适用于SQL 2005,但您需要检查。

答案 5 :(得分:-1)

出于某种原因,如果您尝试重命名不存在的列,PostgreSQL 将发出错误。不幸的是,PostgreSQL 没有为 IF EXISTS 子句提供 RENAME 选项。