SQL - 更新字段,如果大于500

时间:2016-12-29 00:15:38

标签: sql sql-server tsql

我有以下程序:

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。

提前致谢

1 个答案:

答案 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.*

最佳解决方案是在您的应用中避免使用此字符串。您的解决方案应该取决于您对更长和更短的领域的目的。