我想做的是这样的事情:
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';
该命令成功运行,但实际上并未改变列的最大长度。
有什么想法吗?
答案 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)