2016-03-02 39 views
1

爲什麼我不能使用變量來命名新表?T-SQL創建表語句不會接受變量

作爲一個開始的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

如果沒有別的東西,動態SQL將起作用。 – SteveCav

+1

你不能使用表和列名稱的變量,因爲你需要使用動態sql – Roy

+3

不要這樣做。這是糟糕的設計。這就是爲什麼這很難做到。您應該有一個Accounts表和一個Transactions表:Transaction表的每一行都應該引用一個Account.ID。 – Blorgbeard

回答

4

這太長了評論。

SQL不允許表變量。如果你願意,你可以使用動態SQL,但我強烈建議不要這樣做。

你的代碼有幾個缺陷。你應該學會不僅要解決它們,而且要知道它們爲什麼是錯的。

  • 您需要一個「主」表,其中AccountName是一列。具有相同結構的多個表幾乎總是數據庫設計不佳的標誌。
  • 字符串的設計應該使用VARCHAR()NVARCHAR(),除非它們很短或已知長度相同(例如帳號始終爲15個字符)。固定長度的字符串只是浪費空間。
  • 我發現不太可能在這樣的表中名爲category的列是唯一的。這似乎違背了唯一性的含義。
  • 整數在世界大部分地區不適用於貨幣金額(使用decimalmoney)。而且,它們不應該被初始化爲帶有小數點的常量。