使列长度成为另一个数据库中列的最大长度

时间:2016-12-28 01:01:45

标签: sql sql-server tsql

我想做的是这样的事情:

USE [database]

ALTER TABLE Client
    ALTER COLUMN CLientNameShort NVARCHAR(SELECT MAX(LEN([database].dbo.Sites.Sitename))

如果列超过一定长度,我还想对列进行TRIM,因此它会将列的最大长度设置为其他数据库中的最大值,除非最大列超过500个字符等。如果它超过500 ,该列被修剪为500。

这可能吗?

此致

编辑:

所以最终得到了这个:

CREATE PROCEDURE alterFieldSize 
     @column NVARCHAR(MAX), @table NVARCHAR(MAX)
AS
    -- DECLARE VARIABLES
    DECLARE @sql        NVARCHAR(MAX)
    DECLARE @fieldLen   INT
    DECLARE @columnLen  INT

    -- SET VARIABLES
    SET @sql = 'ALTER TABLE Client ALTER COLUMN ' + @column + 'NVARCHAR('+cast(@fieldLen as varchar(20))+')'
    SET @fieldLen = (SELECT MAX(LEN(s.Sitename)) 
                     FROM [database].dbo.Sites s)
    SET @columnLen = (SELECT CHARACTER_MAXIMUM_LENGTH 
                      FROM INFORMATION_SCHEMA.COLUMNS 
                      WHERE COLUMN_NAME = @column AND TABLE_NAME = @table)
    SET @fieldLen = CASE 
                       WHEN @fieldLen < @columnLen 
                          THEN @columnLen 
                       WHEN @fieldLen <=500 
                          THEN @fieldLen 
                       ELSE 500 
                    END

    -- Execution
    EXEC(@sql)

调用这样的程序:

EXEC alterFieldSize @column = 'ClientNameShort', @table = 'Client';

该命令成功运行,但实际上并未改变列的最大长度。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您需要先获取值。然后,我认为你需要alter table的动态SQL。所以:

declare @len int;

select @len = max(len(s.Sitename))
from [database].dbo.Sites s;

declare @sql nvarchar(max);

set @sql = 'alter table client alter column ClientNameShort nvarchar(@len)';

set @sql = replace(@sql, '@len', @len);

exec sp_executesql @sql;

答案 1 :(得分:1)

你需要动态的sql才能做到这一点

Declare @sql varchar(max),
        @len int

set @len = (select MAX(LEN(Sitename)) from [database].dbo.Sites)

set @len = case when @len <=500 then @len else 500 end

SET @sql ='ALTER TABLE Client ALTER COLUMN CLientNameShort NVARCHAR('+cast(@len as varchar(20))+')'

exec(@sql)

答案 2 :(得分:1)

您可以使用COL_Length获取列的长度

   set @sql = 'ALTER TABLE Client ALTER COLUMN CLientNameShort NVARCHAR('+LTRIM(col_length('database.dbo.Sites','Sitename'))+')'
   EXEC(@sql)