我有以下程序:
CREATE PROCEDURE alterFieldSize @column NVARCHAR(MAX), @table NVARCHAR(MAX), @prsColumnLen INT
AS
-- DECLARE VARIABLES
DECLARE @sql NVARCHAR(MAX)
DECLARE @fieldLen INT
DECLARE @columnLen INT
-- SET VARIABLES
SET @fieldLen = @prsColumnLen
SET @columnLen = (SELECT CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE @column AND TABLE_NAME LIKE @table)
SET @fieldLen = CASE WHEN @columnLen > @fieldLen THEN @columnLen WHEN @fieldLen <=500 THEN @fieldLen ELSE 500 END
SET @sql = 'ALTER TABLE Client ALTER COLUMN '+ @column + ' NVARCHAR('+cast(@fieldLen as VARCHAR(20))+')'
-- Execution
EXEC(@sql)
然后通过以下方式调用:
SET @fieldLen = (SELECT MAX(LEN(s.StreetAddress)) FROM [DB1].dbo.Sites s)
EXEC alterFieldSize @column = 'ClientAddress', @table = 'Client', @prsColumnLen = @fieldLen
当然这会遇到问题,因为如果字段值设置为500,那么由于字段太小而无法插入数据,除非我在每个插入语句上手动执行此操作。我想要的是在第500个字符之后取出所有内容,如果在这种情况下字段设置为500。
提前致谢
答案 0 :(得分:1)
变体1:创建新的持久计算列,最大长度为500
alter table add NewPersistedColumn as (left(YourColumn, 500) persisted
变体2:使用左侧函数
代替插入触发器create trigger trg_table on trg_table
instead of insert
as
insert into table (col, col2) select left(col, 500), col2 from inserted.*
最佳解决方案是在您的应用中避免使用此字符串。您的解决方案应该取决于您对更长和更短的领域的目的。