2016-12-28 32 views
3

我想要做的是这样的:使柱长度列的最大长度在另一个数据库

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'; 

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

任何想法?

+0

*最大值在其他数据库*你的意思记录中的最大值或其他数据库中的列的数据类型大小 –

+0

最大值i是指另一个数据库中的最大值,数据将被插入到我想要更改字段长度的数据库中,因此为什么我想改变每个领域的长度。问题是,有些字段的长度为8000个字符,因为人们决定将某人的生活故事放入地址栏。所以我想修剪那些,如果他们超过最大的字段限制,最有可能是500. –

回答

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; 
+0

嗨,感谢您的答复。不幸的是,这个查询只是挂起。它没有运行,直到我将第二行更改为: –

+0

SELECT @fieldLen = MAX(LEN(s.SiteName))FROM [database] .dbo.Sites s; –

+0

你是对的,我以SA身份登录。这是一个新的数据库,到目前为止还没有任何内容。由于某种原因,我得到的错误:不能使用特殊的校长'sa'(错误15405)当试图添加自己作为这个数据库dbowner它适用于我在这里的每个其他数据库... –

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) 
+0

嗨,这也挂起,我让它运行5分钟并取消它。 –

+0

@OwainEsau可能表被锁定。你检查过任何锁吗?客户表中有多少条记录? –

1

可以使用COL_LENGTH获得柱的长度

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