定义具有可变长度的varchar

时间:2015-03-24 17:59:24

标签: sql sql-server tsql varchar alter-table

我正在尝试修改SQL Server 2012数据库中特定表中特定列的数据类型。在脚本的开头,用户将设置列数据类型的新所需长度。但是,当我尝试更改表中的列以设置新的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
  ' @ newPrecis'附近的语法不正确。

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

我现在忽略了任何类型的错误检查,因为我只是试图让基本功能失效。

3 个答案:

答案 0 :(得分:7)

如果您希望能够更改length varchar column的{​​{1}},请使用dynamically,因为dynimic sql不允许varchar(n)的参数1}}:

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错误

答案 1 :(得分:4)

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)

答案 2 :(得分:3)

如果这是脚本顶部的输入参数,则必须使用动态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)