2016-12-28 79 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)