2016-03-02 2 views
1

Почему я не могу использовать переменную, чтобы назвать новую таблицу?T-SQL create table statement не принимает переменную

Как начинающийся проект 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 
) 

Line 6 в этом коде (CREATE TABLE @accountName) выдает ошибку

Неправильный синтаксис около @accountName, ожидая, 'ID', или 'QUOTEID' '' ,

Почему он не вставляет переменную в команду?

+1

Динамический SQL будет работать, если ничего другого. – SteveCav

+1

вы не можете использовать переменную для имен таблиц и столбцов, для чего вам нужно использовать динамический sql – Roy

+3

Не делайте этого. Это плохой дизайн. Вот почему это трудно сделать. У вас должна быть таблица учетных записей и таблица транзакций: каждая строка таблицы транзакций должна ссылаться на Account.ID. – Blorgbeard

ответ

4

Это слишком длинный комментарий.

SQL не позволяет таблицам быть переменными. Вы можете использовать динамический SQL, если хотите, но я настоятельно рекомендую против него.

Ваш код имеет несколько недостатков. Вы должны научиться не только исправлять их, но и почему они ошибаются.

  • Вам нужна «главная» таблица, где AccountName - столбец. Несколько таблиц с одинаковой структурой почти всегда являются признаком плохого проектирования базы данных.
  • Строки должны быть сконструированы с использованием VARCHAR() или NVARCHAR(), если они не являются короткими или известными как одна длина (например, номер счета, который всегда равен 15 символам). Строки фиксированной длины - просто пространство для отходов.
  • Я считаю маловероятным, чтобы столбец с именем category был уникальным в такой таблице. Кажется, это нарушает то, что означает уникальность.
  • Целые числа не подходят для денежных сумм в большинстве стран мира (используйте decimal или money). И они не должны быть инициализированы константам с десятичной точкой.
Смежные вопросы