在此上下文中不允许子查询 - 从2008到2005的SQL语句

时间:2015-02-17 07:22:24

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

我有一个在窗体应用程序中运行的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())"

3 个答案:

答案 0 :(得分:2)

您可以将其转换为使用子查询从select而不是uf插入的查询:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

这是因为您的子查询确实返回的值超过一个标量值 它与SQLServer的版本无关,是一个逻辑问题 把它写成吼叫:

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