【问题标题】:Subqueries are not allowed in this context -- SQL statement from 2008 to 2005此上下文中不允许子查询——2008 年到 2005 年的 SQL 语句
【发布时间】:2015-02-17 07:22:24
【问题描述】:

我有一个在窗口窗体应用程序中运行的 SQL 语句。 我正在使用 SQL Server 2008 进行开发和测试。这里一切正常。

            SqlCommand command1 = new SqlCommand("insert into payment_detail ( " +
                                                "transaction_id, enrolment_id, hkid_1, section_r, " +
                                                "classes, section_fee, assist_amt, additional_assist_amt, " +
                                                "discount_amt, coupon_amt, coupon_amt_no_number, " +
                                                "paid_amt, last_updated_by, last_updated_date) values " +
                                                "(@transaction_id, @enrolment_id, @hkid_1, @section_r, " +
                                                "@classes, @section_fee, (select section_fee - adjusted_section_fee from coursenew where coursecode = @courseCode and section_r = @section_r), @additional_assist_amt, " +
                                                "@discount_amt, @coupon_amt, @coupon_amt_no_number, " +
                                                "@paid_amt, @last_updated_by, GETDATE())"
                                                , myConnection);

但是当移动到另一个使用 SQL Server 2005 的工作站时。 它会提示如下错误

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

很抱歉,因为一台计算机只能安装一个版本的 SQL Server。 我无法使用 SQL Server 2005 测试脚本。

请帮忙,谢谢。

下面会列出完整的sql语句

 insert into payment_detail ( transaction_id, enrolment_id, hkid_1, section_r, classes, section_fee, assist_amt, additional_assist_amt, discount_amt, coupon_amt, coupon_amt_no_number, paid_amt, last_updated_by, last_updated_date) values (@transaction_id, @enrolment_id, @hkid_1, @section_r, @classes, @section_fee, (select section_fee - adjusted_section_fee from coursenew where coursecode = @courseCode and section_r = @section_r), @additional_assist_amt, @discount_amt, @coupon_amt, @coupon_amt_no_number, @paid_amt, @last_updated_by, GETDATE())"

【问题讨论】:

  • 我有点懒,但是如果你编辑你的SQL语句(删除所有的“和,+等,并很好地格式化它),我会看看它。
  • “因为一台计算机只能安装一个版本的 SQL Server”——我不知道你为什么相信这是真的,但事实并非如此。我当前的机器正在运行 3 个不同的 SQL Server 实例,它们都在不同的版本上。目前运行 2008、2012 和 2014 年,但我一直在运行这样的混合,早在 2000、2005 和 2008 年安装。
  • 操作。你的意思是直接安装不同的版本还是需要一些设置才能安装?

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

您可以将其转换为从选择中插入的查询,而不是使用子查询:

insert into payment_detail (
  transaction_id, enrolment_id, hkid_1, section_r, classes, section_fee,
  assist_amt,
  additional_assist_amt, discount_amt, coupon_amt, coupon_amt_no_number,
  paid_amt, last_updated_by, last_updated_date
)
select
  @transaction_id, @enrolment_id, @hkid_1, @section_r, @classes, @section_fee,
  section_fee - adjusted_section_fee,
  @additional_assist_amt, @discount_amt, @coupon_amt, @coupon_amt_no_number,
  @paid_amt, @last_updated_by, GETDATE()
from
  coursenew
where
  coursecode = @courseCode and section_r = @section_r

【讨论】:

  • 首先感谢您的回复。这是我第一次看到这种风格的查询。但它在 SQL 2005 中有效吗?
  • @user3423149 - 它甚至可以追溯到 SQL Server 2000(参见示例 G)。
  • 让我实施到工作站。如果有效,我稍后会标记为答案。感谢您的大力帮助
【解决方案2】:

解决此问题的最简单方法是在运行插入之前将您的 select 语句放入一个局部变量中,然后使用您的临时表代替子查询。

https://msdn.microsoft.com/en-us/library/ms188927.aspx

编辑:选择局部变量的具体示例。 https://msdn.microsoft.com/en-us/library/ms187330.aspx

【讨论】:

    【解决方案3】:

    这是因为您的子查询确实返回了多个一个标量值。
    与SQLServer版本无关,是逻辑问题。
    写成下面这样:

    select TOP 1 section_fee - adjusted_section_fee from coursenew where coursecode = @courseCode and section_r = @section_r
    

    【讨论】:

    • 不是真的兄弟。 coursecode 和 section_r 是 coursenew 表的键 它在我的 SQL Server 2008 中有效,但在 2005 年无效
    • 不,这不是因为多个值,它实际上是SQL Server 2005 中insert 语句的限制。“表达式不能包含SELECT 或EXECUTE 语句”msdn.microsoft.com/en-us/library/ms174335%28v=sql.90%29.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多