【问题标题】:Using a sub-query in an SQL insert statement在 SQL 插入语句中使用子查询
【发布时间】:2015-01-14 00:33:08
【问题描述】:
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

我的上述查询在 SQL Server 2012 中运行良好,但在 SQL Server 2005 中失败并显示以下错误消息。

在这种情况下不允许子查询。只允许使用标量表达式。

【问题讨论】:

  • 如果 N'Default City', 0 是硬编码值,在选择语句本身中使用它,但删除关键字 VALUES
  • 此功能是在 SQL Server 2008 中引入的。因此,在低于此的版本中,您需要声明变量并将值分配给变量并在 INSERT 语句中使用它。

标签: sql-server tsql sql-server-2005


【解决方案1】:

像这样更改您的insert

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

【讨论】:

  • 如果选择查询没有 CityCategoryId。然后不会插入值 N'Default City',0。
【解决方案2】:

尝试使用变量@CityCategoryId. 我不知道@CityCategoryId 的类型。你可以使用你想要的数据类型。

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

【讨论】:

    【解决方案3】:

    试试这样。不确定...

    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
    

    【讨论】:

    • 如果选择查询没有 CityCategoryId。然后不会插入值 N'Default City',0。
    • 是的,这是真的.. 好找到兄弟.. 我没注意到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2018-09-23
    • 1970-01-01
    • 2017-04-23
    相关资源
    最近更新 更多