2009-06-01 58 views
25

在SQL Server 2000或更高版本中,使用類似下面的語句時,是否有處理自動生成的主鍵(標識)列?處理「Insert Into TABLE Values()」語句中的標識列?

Insert Into TableName Values(?, ?, ?) 

我的目標是根本不使用列名。

+4

你爲什麼不想要使用的列名目錄表的名字嗎? – 2009-06-01 15:19:15

+0

@Mitch,它有點複雜,但我有一個程序,可以隨時生成SQL,並且在我的原始設計中,我沒有處理任何標識列,因此我排除了列名。我需要做一個快速更新,並且我可以避免使用列名,這會使它更容易。 – 2009-06-01 15:28:54

+0

@ nemo--之前一直處於「快速補丁」狀態,現在我會給你一個這樣的傳球。但爲了您自己的利益,請在下一個完整更新中指定列名稱...... – RolandTumble 2009-06-01 16:57:32

回答

49

默認情況下,如果你有一個標識列,你需要在指定它VALUES部分。如果你的表是:

ID NAME ADDRESS 

然後,你可以這樣做:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA') 

這將自動生成的ID爲你,你不必在所有去想它。如果您​​,您可以將值分配給ID列。

6

你有兩個選擇:

1)請指定列名列表(不帶標識列)。

2)SET IDENTITY_INSERT表名ON,後跟插入語句,爲標識列提供顯式值,後跟SET IDENTITY_INSERT表名OFF。

如果要避免列名列表,也許這「招」可能會幫助?:

-- Get a comma separated list of a table's column names 
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()] 
FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE 
TABLE_NAME = 'TableName' 
Order By Ordinal_position 
FOR XML PATH('') 
), 1,1, '') 
+0

只是爲了闡明,通過顯式值您的意思是您必須查詢數據庫以查看序列中的下一個標識會手動插入它? – 2009-06-01 15:16:18

+0

不,您可以使用任何尚未存在的值,但順序中的下一個將從最大的一個加上一個開始...... – 2009-06-01 15:17:35

+0

只有當您擁有需要的參考數據之類的東西時纔會使用它在不同的應用程序安裝中使用完全相同的ID值 – 2009-06-01 15:18:51

2

因爲它是不實際的把代碼中的註釋,以響應Eric的回答,它不是爲你工作您的評論...

我只是跑在SQL 2005箱以下的(對不起,沒有2000方便),採用默認設置和它的工作沒有錯誤:

CREATE TABLE dbo.Test_Identity_Insert 
(
    id INT IDENTITY NOT NULL, 
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id) 
) 
GO 

INSERT INTO dbo.Test_Identity_Insert VALUES ('test') 
GO 

SELECT * FROM dbo.Test_Identity_Insert 
GO 

你也許在你的價值觀列表發送的ID值?如果你真的爲它傳遞了一個值,我認爲你不能忽略該列。例如,如果您的表格有6列,並且您想忽略IDENTITY列,則只能傳遞5個值。

22

生成列列表的另一個「技巧」是將「列」節點從對象資源管理器拖到查詢窗口。

9

最好的做法是明確列出的列:(???)

插入進表名(COL1,COL2,COL2)值

否則,如果您添加其他你原來的插入將打破列到你的表。

1

解決方案:

1)設置IDENTITY_INSERT爲ON。

2)將客戶數據插入客戶表。

3)將IDENTITY_INSERT設置爲OFF。

閱讀全文here

0
set identity_insert customer on 
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234) 

其中「客戶」是

相關問題