【问题标题】:ALTER COLUMN IF EXISTS如果存在则更改列
【发布时间】:2013-12-31 15:03:13
【问题描述】:

如果表中存在具有相同数据类型和编号的列,我想更改表

原来的tTable结构是

表名

ColumnName NVARCHAR(100)

如果存在ColumnNameNVARCHAR 且长度为100,则用于更改列的代码

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

我需要在IF EXISTS(...) 插入什么查找查询?

【问题讨论】:

  • 为什么要标记 3 个sql-server 版本???只需输入您正在处理的版本!!!

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


【解决方案1】:

出于detailed by Aaron Bertrand 的原因,我个人总是选择 SQL Server 系统视图而不是 INFORMATION_SCHEMA。额外的好处是,在这种情况下,您可以排除计算列,这些列在表 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) 系统视图,但我更喜欢元数据功能。
【解决方案2】:
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

【讨论】:

  • 你在哪里检查长度 100 存在??
  • 很好的发现 @huMptyduMpty 现在修复了它:)
【解决方案3】:

我,我懒得输入所有系统表连接(更不用说 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,但您需要检查一下。

【讨论】:

  • 忘了说,我更喜欢这种形式,因为它更容易弄清楚 IF 语句在做什么......
【解决方案4】:
SELECT column_name 'Column Name',
data_type 'Data Type',
CHARacter_maximum_length 'Maximum Length'
FROM information_schema.columns
WHERE table_name = 'TableName'

从这里你得到列名并以游标的形式输入,考虑每一行并处理休息

【讨论】:

    【解决方案5】:

    试试这个

    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
    

    【讨论】:

    • 你在哪里查看length 100 exists??
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 2014-08-25
      • 2014-01-20
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多