T-SQL create table语句不会接受变量

时间:2016-03-02 02:48:47

标签: sql sql-server tsql

为什么我不能使用变量命名新表?

作为一个开始的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'。

为什么不将变量插入命令?

1 个答案:

答案 0 :(得分:4)

评论太长了。

SQL不允许表为变量。如果您愿意,可以使用动态SQL,但我强烈建议不要使用它。

您的代码有几个缺陷。你不仅要学会修复它们,还要学习它们为什么是错误的。

  • 你需要一个"大师"表,其中AccountName是一列。具有相同结构的多个表几乎总是数据库设计不佳的标志。
  • 字符串应使用VARCHAR()NVARCHAR()进行设计,除非它们很短或已知长度相同(例如,帐号始终为15个字符)。固定长度的字符串只是浪费空间。
  • 我发现名为category的列不太可能在这样的表中是唯一的。它似乎违反了唯一性的含义。
  • 在全球大部分地区,整数不适用于货币金额(使用decimalmoney)。并且,它们不应该被初始化为带小数点的常量。