添加大小可变的nvarchar列

时间:2019-06-10 19:32:48

标签: sql sql-server tsql

我正在尝试将未知大小的列动态添加到表中。为什么以下内容不起作用,否则如何在上下文中使该东西起作用?

DECLARE @size int
SET @size = 200
GO

ALTER TABLE Testbench.dbo.Certificate 
    ADD E35 NVARCHAR(@size)

这将产生:

  

@size附近的语法错误

上下文

DECLARE @size int
SET @size = 200
GO

ALTER TABLE Testbench.dbo.Certificate 
    ADD E35 NVARCHAR(@size)
GO

UPDATE Testbench.dbo.Certificate 
SET E35 = ''

ALTER TABLE Testbench.dbo.Certificate 
    ALTER COLUMN E35 NVARCHAR(@size) NOT NULL

这产生两次:

  

@size附近的语法错误

谢谢。

2 个答案:

答案 0 :(得分:2)

  

为什么以下各项不起作用?

因为不能在SQL Server中参数化数据定义语言(DDL)语句。您可以改用Dynamic SQL。 EG:

DECLARE @size int
SET @size = 200
DECLARE @sql nvarchar(max)
set @sql = concat('ALTER TABLE Testbench.dbo.Certificate ADD E35 NVARCHAR(',@size,')')
exec (@sql)

答案 1 :(得分:2)

这里有两个问题:

  1. 第一个是GO批处理分隔符。 GO 不是sql语言的一部分。它是由几个著名工具使用的批处理分隔符,但是它不是语言的一部分。您看到的是您的工具在每个GO之后作为单独的会话的一部分发送附加语句,其中@size变量不再存在。
  2. 无论如何,您都不能在ALTER语句中使用参数。