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

T-SQL create table语句将不接受变量,sql,sql-server,tsql,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 accoun

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

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


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

这太长了,无法添加注释

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

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

  • 您需要一个“主”表,其中
    AccountName
    是一列。具有相同结构的多个表几乎总是数据库设计不佳的标志
  • 字符串应使用
    VARCHAR()
    NVARCHAR()
    进行设计,除非它们很短或已知长度相同(例如帐户号码始终为15个字符)。固定长度的字符串只会浪费空间
  • 我发现名为
    category
    的列在这样的表中不太可能是唯一的。这似乎违背了独特性的含义
  • 在世界上大多数地方,整数不适用于货币金额(使用
    十进制
    货币
    )。而且,它们不应该初始化为带有小数点的常量

    • 这篇评论太长了

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

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

      • 您需要一个“主”表,其中
        AccountName
        是一列。具有相同结构的多个表几乎总是数据库设计不佳的标志
      • 字符串应使用
        VARCHAR()
        NVARCHAR()
        进行设计,除非它们很短或已知长度相同(例如帐户号码始终为15个字符)。固定长度的字符串只会浪费空间
      • 我发现名为
        category
        的列在这样的表中不太可能是唯一的。这似乎违背了独特性的含义
      • 在世界上大多数地方,整数不适用于货币金额(使用
        十进制
        货币
        )。而且,它们不应该初始化为带有小数点的常量

      如果没有其他功能,动态SQL也可以工作。您不能将变量用于表名和列名,因此您需要使用动态SQL不要这样做。这是个糟糕的设计。这就是为什么很难做到的原因。您应该有一个Accounts表和一个Transactions表:Transactions表的每一行都应该引用Account.ID。您不能在查询中使用变量作为表名。更好的选择是使用一个表和一个列来区分银行。具有相同结构和用途的多张表通常是一个糟糕的设计。感谢大家的建议。有趣的是,代码中看起来像一个bug的东西会暴露出设计中的一个基本缺陷。如果没有其他缺陷,动态SQL也可以工作。您不能使用变量作为表名和列名,因此您需要使用动态SQL。不要这样做。这是个糟糕的设计。这就是为什么很难做到的原因。您应该有一个Accounts表和一个Transactions表:Transactions表的每一行都应该引用Account.ID。您不能在查询中使用变量作为表名。更好的选择是使用一个表和一个列来区分银行。具有相同结构和用途的多张表通常是一个糟糕的设计。感谢大家的建议。有趣的是,代码中看起来像一个bug的东西可以揭示设计中的一个基本缺陷。