Sql server 在SQL insert语句中使用子查询

Sql server 在SQL insert语句中使用子查询,sql-server,tsql,sql-server-2005,Sql Server,Tsql,Sql Server 2005,我有上面的查询,它在SQL server 2012中运行良好,但在SQL server 2005中失败,并显示以下错误消息 在此上下文中不允许子查询。只允许使用标量表达式 像这样更改您的insert IF NOT EXISTS (SELECT TOP 1 CityName FROM dbo.City WHERE [Name] = 'Default City') BEGIN INSERT dbo.City ( CityName, Status,CityCategoryId) VALUES (N

我有上面的查询,它在SQL server 2012中运行良好,但在SQL server 2005中失败,并显示以下错误消息

在此上下文中不允许子查询。只允许使用标量表达式


像这样更改您的
insert

IF NOT EXISTS (SELECT TOP 1 CityName FROM dbo.City WHERE [Name] = 'Default City')
BEGIN
INSERT dbo.City ( CityName, Status,CityCategoryId) VALUES  
(N'Default City', 0, (SELECT CityCategoryId FROM dbo.CityCategory WHERE [CityCategoryName] = N'Default City Category'))
END
GO

像这样试试。我不确定

INSERT dbo.City
       (CityName,Status,CityCategoryId)
SELECT N'Default City',0,CityCategoryId
FROM   dbo.CityCategory
WHERE  [CityCategoryName] = N'Default City Category' 

尝试使用变量
@CityCategoryId。
我不知道@CityCategoryId的类型。您可以使用所需的数据类型

IF NOT EXISTS (SELECT TOP 1 CityName FROM dbo.City WHERE [Name] = 'Default City')
BEGIN
INSERT dbo.City ( CityName, Status,CityCategoryId)  
SELECT 'Default City',0, CityCategoryId FROM dbo.CityCategory WHERE [CityCategoryName] = N'Default City Category'
END
GO

如果N'Default City',0是硬编码值,请在select语句中使用它,但删除关键字值此功能是在SQL Server 2008中引入的。因此,在下面的版本中,您需要声明变量并将值赋给变量,然后在INSERT语句中使用它。则不会插入“默认城市”的值0。如果没有用于select查询的CityCategoryId。然后将不会插入“默认城市”0的值。是的,这是真的。。好的,兄弟。。我没注意到
IF NOT EXISTS (SELECT TOP 1 CityName FROM dbo.City WHERE [Name] = 'Default City')
BEGIN
    Declare @CityCategoryId AS NVARCHAR(100)
    SELECT @CityCategoryId = CityCategoryId FROM dbo.CityCategory 
           WHERE [CityCategoryName] = N'Default City Category'

    INSERT dbo.City( CityName, Status, CityCategoryId) 
    VALUES  
        (N'Default City', 0, @CityCategoryId)
END
GO