我正在尝试修改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
语句中输入的长度。
我现在忽略了任何类型的错误检查,因为我只是试图让基本功能失效。
答案 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)