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

3
我想要做的是类似于这样的事情:
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';

该命令成功运行,但实际上并未更改列的最大长度。有任何想法吗?

其他数据库中的最大值,您是指记录中的最大值还是其他数据库列的数据类型大小? - Pரதீப்
最大值指的是另一个数据库中的最大值,数据将被插入到我想要更改字段长度的数据库中,因此我想要更改每个字段的长度。问题在于,一些字段的长度为8000个字符,因为人们决定将某人的生活故事放入地址字段中。因此,如果它们超过最大字段限制(最可能为500),我想要修剪它们。 - Owain Esau
3个回答

1
你需要先获取该值。然后,我认为你需要使用动态SQL进行alter table。因此:
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;

嗨,谢谢回复。不幸的是,这个查询只是挂起了。直到我将第二行改成: - Owain Esau
从[database].dbo.Sites s中选择@fieldLen = MAX(LEN(s.SiteName)); - Owain Esau
你说得对,我已经作为SA登录了。这是一个新恢复的数据库,该表中还没有任何内容。出于某种原因,当我尝试将自己添加为此数据库的dbowner时,我遇到了错误:“无法使用特殊主体'sa'(错误15405)”,但对于我在这里拥有的每个其他数据库都可以正常工作... - Owain Esau

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)

嗨,这个也卡住了,我让它运行了5分钟然后取消了。 - Owain Esau
@OwainEsau 可能是表被锁定了。你有检查过是否有任何锁定吗?客户表中有多少条记录? - Pரதீப்

1
您可以使用COL_Length获取列的长度。
   set @sql = 'ALTER TABLE Client ALTER COLUMN CLientNameShort NVARCHAR('+LTRIM(col_length('database.dbo.Sites','Sitename'))+')'
   EXEC(@sql)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接