SQL Server:仅当现有列的长度较小时才使用ALTER COLUMN

时间:2016-06-23 18:28:58

标签: sql-server

我正在尝试创建一个脚本,只有当列的大小不正确时才会更改列。这样的事情。

IF NOT EXISTS (SELECT COL_LENGTH('dbo.TSC701_OCT_CONTEXT', 'sql_stmt') = 1000 )
BEGIN
    ALTER TABLE dbo.TSC701_OCT_CONTEXT 
        ALTER COLUMN sql_stmt VARCHAR(1000)
END

抱歉搞砸了语法

4 个答案:

答案 0 :(得分:0)

你可以这样试试。

IF (SELECT CASE WHEN COL_LENGTH('dbo.TSC701_OCT_CONTEXT', 'sql_stmt') <> 1000 THEN 1 END) = 1
BEGIN ALTER TABLE dbo.TSC701_OCT_CONTEXT alter column sql_stmt varchar(1000) END

答案 1 :(得分:0)

IF 1000 = (SELECT CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='Database Name' AND TABLE_NAME='Table Name' AND COLUMN_NAME='Column Name')
BEGIN
    ALTER TABLE [Table Name]
    ALTER COLUMN [Column Name] varchar(1000) null
END

答案 2 :(得分:0)

实际上,您不需要IF子句中的SELECT语句。

IF (COL_LENGTH('dbo.TSC701_OCT_CONTEXT', 'sql_stmt') < 1000)
BEGIN
    ALTER TABLE [Table Name]
    ALTER COLUMN [Column Name] varchar(1000) null
END

此外,如果您的列必须为NOT NULL或已设置为NOT NULL,则您需要将null从上方切换为NOT NULL

如果您的目标是检查数据库中的每一列,则可以使用以下代码。请注意,这可能会非常缓慢,并可能导致意外错误和问题。我会在运行它之前立即备份您计划使用的任何数据库,我也会在一个小型测试数据库或一个表上运行它,看看它是否能满足您的要求而不需要太长时间。

DECLARE @TABLE_CATALOG NVARCHAR(128), @TABLE_SCHEMA NVARCHAR(128), @TABLE_NAME NVARCHAR(128), @COLUMN_NAME NVARCHAR(128), @DATA_TYPE NVARCHAR(128)
DECLARE @IS_NULLABLE NVARCHAR(3)
DECLARE @sql NVARCHAR(1000)

WHILE EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='teoe' AND CHARACTER_MAXIMUM_LENGTH < 1000)
BEGIN
    SELECT TOP 1 
        @TABLE_CATALOG = TABLE_CATALOG, 
        @TABLE_SCHEMA = TABLE_SCHEMA, 
        @TABLE_NAME = TABLE_NAME, 
        @COLUMN_NAME = COLUMN_NAME, 
        @IS_NULLABLE = IS_NULLABLE, 
        @DATA_TYPE = DATA_TYPE
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='teoe'
    AND CHARACTER_MAXIMUM_LENGTH < 1000

    SET @sql = 'ALTER TABLE [' + @TABLE_CATALOG + '].' + @TABLE_SCHEMA + '.[' + @TABLE_NAME + '] ALTER COLUMN [' + @COLUMN_NAME + '] '+ @DATA_TYPE + '(1000) ' +
        CASE WHEN @IS_NULLABLE = 'YES' THEN 'NULL' ELSE 'NOT NULL' END
    EXECUTE @sql
    BREAK

END

答案 3 :(得分:0)

以下是我最终的结果:

IF NOT EXISTS (SELECT 1 FROM sys.columns 
            WHERE name = 'sql_stmt' AND object_id = object_id('CONTEXT') and max_length = 1000)
BEGIN
    ALTER TABLE dbo.CONTEXT ALTER COLUMN [sql_stmt] varchar (1000) NULL
END

GO