Sql-Server
VALUES 子句中的子查詢
這是一個真實世界的架構:
CREATE TABLE [dbo].[Setting] ( [ID] [BIGINT] NOT NULL, [Module] [NVARCHAR](400) NOT NULL, [Property] [NVARCHAR](400) NOT NULL, [Value] [NVARCHAR](4000) NULL, PRIMARY KEY CLUSTERED ( [ID] ASC ) )
這是
INSERT
我要執行的語句:INSERT INTO [Setting] ([ID], [Module], [Property], [Value]) VALUES ((SELECT COALESCE(max(ID), 0) + 1 FROM [Setting]), N'security.catalogs.integrated.integrated', N'enable-integrated-authentication', N'true')
對於我的生活,我在這裡看不到任何特別之處,但至少有兩次在 SQL Server 2008 R2 Express 上失敗,並出現以下錯誤消息:
Subqueries are not allowed in this context. Only scalar expressions are allowed.
該
INSERT
語句在一個完全空的表上執行,據稱沒有為 SQL Server 配置任何奇怪的選項,什麼也沒有。這怎麼可能發生?根據我對 SQL Server 的理解,
max
不可能返回超過一行。
在實驗上,您的程式碼在 10.50.1600 (2008 R2 RTM) Developer 和 10.0.4000 (2008 SP2) Express 上都適用於我。但是,它在 9.0.5057(2005 SP4 + 修補程序)上失敗了。所以,我深入研究了文件。
2005年版本對子句中的表達式進行了說明
VALUES
(強調我的):表達
是常量、變數或表達式。表達式不能包含SELECT 或 EXECUTE語句。
而2008 及更高版本看起來像這樣:
表達
是常量、變數或表達式。表達式不能包含EXECUTE語句。
根據這個證據,我只能假設您執行這些查詢的伺服器版本不是您認為的那樣。
從我一直在閱讀的內容來看,您不允許在這樣的插入語句中使用子查詢。當 Setting 為空時它可能會起作用,因為它的計算結果為 NULL。這是編寫這樣的查詢的常用方法。
insert into [Setting] ([ID], [Module], [Property], [Value]) select coalesce(max(ID), 0) + 1, N'security.catalogs.integrated.integrated', N'enable-integrated-authentication', N'true' from [Setting];