【问题标题】:Make column length the max length of a column in another database使列长度成为另一个数据库中列的最大长度
【发布时间】:2017-05-12 06:21:28
【问题描述】:

我想做的是这样的:

USE [database]

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

如果列超过一定长度,我也想修剪列,所以它会将列的最大长度设置为另一个数据库中的最大值,除非最大列超过 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';

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

有什么想法吗?

【问题讨论】:

  • 其他数据库中的最大值你是指其他数据库中记录的最大值还是列的数据类型大小
  • 通过最大值我是指另一个数据库中的最大值,数据将被插入到我想要更改字段长度的数据库中,因此我想更改每个的长度场地。问题是一些字段的长度为 8000 个字符,因为人们决定将某人的生活故事放入地址字段中。因此,如果它们超过最大字段限制(很可能是 500),我想修剪它们。

标签: sql sql-server tsql


【解决方案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;

【讨论】:

  • 您好,感谢您的回复。不幸的是,这个查询只是挂起。它最初没有运行,直到我将第二行更改为:
  • SELECT @fieldLen = MAX(LEN(s.SiteName)) FROM [database].dbo.Sites s;
  • 你是对的,我以 SA 身份登录。这是一个新恢复的数据库,该表中还没有任何内容。出于某种原因,我收到错误消息:尝试将自己添加为此数据库的 dbowner 时无法使用特殊主体“sa”(错误 15405),它适用于我在这里拥有的所有其他数据库...
【解决方案2】:

您需要动态 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 分钟并取消了它。
  • @OwainEsau 可能是表被锁定。你检查过任何锁吗?客户表中有多少条记录?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多