为什么我不能使用变量命名新表?
作为一个开始的SQL项目,我正在创建个人财务数据库。每个帐户在数据库中都有一个对应的表。还有一个列出所有当前帐户的表格。请参阅下面的(简化)代码示例:
CREATE TABLE accountList
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[Name] NCHAR(30) NOT NULL UNIQUE,
[Active] BIT NOT NULL
)
INSERT INTO accountList(name, active)
VALUES
('Bank_One_Checking', 1);
CREATE TABLE Bank_One_Checking
(
[Id] BIGINT NOT NULL PRIMARY KEY IDENTITY,
[payee] NCHAR(30) NOT NULL UNIQUE,
[category] NCHAR(30) NOT NULL UNIQUE,
[amount] INT NOT NULL DEFAULT 0.00
)
此代码有效。我想将帐户名设置为变量(因此它可以作为参数传递给存储过程)。请参阅以下代码:
DECLARE @accountName nchar(30);
SET @accountName = 'Bank_One_Savings';
INSERT INTO accountList(name, active)
VALUES
(@accountName, 1);
CREATE TABLE @accountName
(
[Id] BIGINT NOT NULL PRIMARY KEY IDENTITY,
[payee] NCHAR(30) NOT NULL UNIQUE,
[category] NCHAR(30) NOT NULL UNIQUE,
[amount] INT NOT NULL DEFAULT 0.00
)
该代码中的第6行(CREATE TABLE @accountName)产生错误
@accountName附近的语法不正确,期待'。',' ID'或' QUOTEID'。
为什么不将变量插入命令?
答案 0 :(得分:4)
评论太长了。
SQL不允许表为变量。如果您愿意,可以使用动态SQL,但我强烈建议不要使用它。
您的代码有几个缺陷。你不仅要学会修复它们,还要学习它们为什么是错误的。
AccountName
是一列。具有相同结构的多个表几乎总是数据库设计不佳的标志。VARCHAR()
或NVARCHAR()
进行设计,除非它们很短或已知长度相同(例如,帐号始终为15个字符)。固定长度的字符串只是浪费空间。category
的列不太可能在这样的表中是唯一的。它似乎违反了唯一性的含义。decimal
或money
)。并且,它们不应该被初始化为带小数点的常量。