定义可变长度的 varchar

Define varchar with variable length

我正在尝试修改 SQL Server 2012 数据库中特定 table 中特定列的数据类型。在脚本的开头,用户将设置列数据类型的新所需长度。但是,当我尝试更改 table 中的列以设置新的 varchar 长度时,出现错误。

这是代码片段和产生的错误:

Declare @newPrecis int

Set @newPrecis = 23 -- New length of the index

Alter Table [dbo].[VTAB0047] Alter Column VAL varchar(@newPrecis)

错误:

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near '@newPrecis'.

目前 VAL 列的长度是 varchar(20),我希望将其设置为 23 的长度或在 set 语句中输入的任何长度。

目前我忽略了任何类型的错误检查,因为我只是想降低基本功能。

如果你希望能够改变 varchar column dynamicallylength 然后使用 dynimic sql,因为 varchar(n) 不允许参数n:

declare @sql varchar(500);
Declare @newPrecis int
Set @newPrecis = 23 --or any other value 

set @sql='Alter Table [dbo].[VTAB0047] Alter Column VAL varchar('+cast(@newPrecis as varchar(2))'+')'
exec(@sql)

或者您可以直接使用:

Alter Table [dbo].[VTAB0047] Alter Column VAL varchar(23)

注意: 如果 n 的新值小于旧值,那么如果您的值长度大于旧值,则可能会出现 String or binary data would be truncated 错误比新的长度值。

如果这是脚本顶部的输入参数,则必须使用 Dynamic SQL 完成 ALTER TABLE 语句。例如。

DECLARE @SQL VARCHAR(MAX)
DECLARE @newPrecis INT

SET @SQL = 'ALTER TABLE dbo.VTAB0047 ALTER COLUMN VAL VARCHAR(' + CAST(@newPrecis AS VARCHAR(20)) + ')'
EXEC(@SQL)
Declare @newPrecis  int    
Declare @query varchar(max)

Set @newPrecis  = 23; -- New length of the index
set @query ='Alter Table [dbo].[VTAB0047] Alter COLUMN  VAL varchar('
  + Cast(@newPrecis  as varchar) +')'

 exec (@query)