Sql-Server

VALUES 子句中的子查詢

  • February 26, 2013

這是一個真實世界的架構:

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];

引用自:https://dba.stackexchange.com/questions/35386