sql server数据库中连接附近的语法错误

mutmk8jj  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(345)

从c#对microsoft sql server数据库运行以下sql查询时出现以下错误:
关键字join附近的语法不正确
当然,查询包含 SELECT 部分。

SELECT
  Patient.FirstName,
  Patient.LastName,
  Patient.PatientId,
  Patient.PatientSer,
  CAST(Course.StartDateTime AS DateTime),
  Course.ClinicalStatus,
  CAST(Course.CompletedDateTime AS DateTime),
  CAST(ScheduledActivity.CreationDate AS DateTime),
  CAST(ScheduledActivity.ActualStartDate AS DateTime),
  CAST(ScheduledActivity.ActualEndDate AS DateTime),
  ScheduledActivity.ActivityNote,
  Activity.ActivityCode,
  Activity.ActivityType,
  Activity.ObjectStatus,
  CAST(Activity.HstryDateTime AS DateTime),
  Activity.HstryTaskName
FROM
  Patient
  INNER JOIN Course
    ON (Patient.PatientSer=Course.PatientSer)
  INNER JOIN ScheduledActivity
    ON (Patient.PatientSer=ScheduledActivity.PatientSer)
  INNER JOIN ActivityInstance
    ON (ScheduledActivity.ActivityInstanceSer=ActivityInstance.ActivityInstanceSer)
  INNER JOIN Activity
    ON (Activity.ActivitySer=ActivityInstance.ActivitySer)
WHERE
  Patient.PatientId=@patientId;

一个非常相似的查询被成功解析,没有任何问题。我一辈子都不明白,为什么这不管用。现在,我希望有人能像系统所说的那样,确保这个查询中确实存在语法错误,因为我确实无法发现它。
“同事”用来对数据库运行查询的c#脚本也可能有问题,但这是一个完全不同的问题。

ss2ws0br

ss2ws0br1#

我同意tgolisch的观点,从可读性的Angular 来看,获取表别名引用既可以缩短查询的时间,也可以在需要在同一查询中多次连接同一个表的情况下缩短查询的时间。例如,employee id和supervisor id都指向person表以获取名称。每个id代表一个人。有化名会有帮助。
现在,回到你原来的岗位。它真的像ssms下写的那样工作吗?何时提供患者id?如果没有,先把它修好。如果查询确实有效,那么它就在c代码中如何准备查询的某个地方。如果是这样的话,发布c#的整个代码(没有实际的登录凭证),但是要评估整个代码。
在最简单的测试用例中,我将使用c#并尝试一步一步地执行查询,例如获取每一列,这样您就不必担心可能失败的“cast()”问题。另外,放置一个特定的patient id vs参数来测试并确保所有连接都工作。如果一开始连接失败,那么其他字段是什么并不重要。如果参数是坏的,那也从问题方程中去掉了。我要添加的另一个别名是“scheduledactivity”表引用,例如:“sa”或“scha”,以及“activityinstance”到“ai”或“acti”

yourSqlCommand.CommandText =
@"SELECT 
          *
       FROM
          Patient P
             INNER JOIN Course C
                ON P.PatientSer = C.PatientSer
             INNER JOIN ScheduledActivity SA
                ON P.PatientSer = SA.PatientSer
                INNER JOIN ActivityInstance AI
                   ON SA.ActivityInstanceSer = AI.ActivityInstanceSer
                   INNER JOIN Activity A
                      ON AI.ActivitySer = A.ActivitySer
        WHERE
          P.PatientId=@parmForPatientID
";

Mino

更新以显示我个人如何使用前导“@”在c中编写sql查询,该前导“@”允许一个字符串跨越多行。我完全清楚地理解了SQLin1语句,而没有猜测多行上的串联是从何而来的。我甚至更改了参数以显示基于sql“@”的参数名。我还尝试使用“@parm”作为前缀,以防止来自某个表或参数的任何歧义。。。别猜了。
重新格式化查询以显示表依赖于上一个表的位置缩进。。。在imo中,更容易理解a->b->c之间的关系,也更新了别名,如上面的文章所述。

a64a0gku

a64a0gku2#

sql server有几个保留字。记住它们确实很困难,所以在任何可能(可能)与保留字同名的表名周围使用分隔符是个好主意。示例:[分隔符]
试试这个:

SELECT
  P.FirstName,
  P.LastName,
  P.PatientId,
  P.PatientSer,
  CAST(C.StartDateTime AS DateTime) StartDateTime,
  C.ClinicalStatus,
  CAST(C.CompletedDateTime AS DateTime) CompletedDateTime,
  CAST(ScheduledActivity.CreationDate AS DateTime) CreationDate,
  CAST(ScheduledActivity.ActualStartDate AS DateTime) ActualStartDate,
  CAST(ScheduledActivity.ActualEndDate AS DateTime) ActualEndDate,
  ScheduledActivity.ActivityNote,
  A.ActivityCode,
  A.ActivityType,
  A.ObjectStatus,
  CAST(A.HstryDateTime AS DateTime) HstryDateTime,
  A.HstryTaskName
FROM
  [Patient] P
  INNER JOIN [Course] C
    ON (P.PatientSer=C.PatientSer)
  INNER JOIN ScheduledActivity
    ON (P.PatientSer=ScheduledActivity.PatientSer)
  INNER JOIN ActivityInstance
    ON (ScheduledActivity.ActivityInstanceSer=ActivityInstance.ActivityInstanceSer)
  INNER JOIN [Activity] A
    ON (A.ActivitySer=ActivityInstance.ActivitySer)
WHERE
  P.PatientId=@patientId;

相关问题