在 SQL Where 子句中使用包含逗号的变量

Use a variable in SQL Where clause that contains commas

我在 SQL 服务器 2008 中有一个 table。table 有一个名为 CC_TERMID 的字段,它是一个数字字段。我有一个 oracle 服务器上的数据,我想在其中找到我们所在日期的当前 TermID,我想将其用作我的 SQL table 的变量。我很确定我的错误是数据类型不匹配,但我不知道如何存储变量的数据。

这是我使用 openquery 创建的变量,用于从 Oracle 中提取我想要的数据:

    DECLARE @TERMS nvarchar(50)
    SET @TERMS = (SELECT * FROM OPENQUERY(POWERSCHOOL,
    '
    SELECT TO_NUMBER(LISTAGG(ID, '','') WITHIN GROUP (ORDER BY SCHOOLID))
    FROM TERMS
    WHERE SYSDATE + (SELECT FIRSTDAY - SYSDATE
                     FROM TERMS
                     WHERE ISYEARREC = 1 AND YEARID = (SELECT MAX(SUBSTR(TERMID, 1,2))
                                                       FROM CC) AND SCHOOLID = 51) BETWEEN FIRSTDAY AND LASTDAY AND SCHOOLID = 51
   '))

这个returns数据像2700,2701,2703,2704

现在我想在针对我的 SQL table 的查询中使用该变量,如下所示:

    SELECT TCH_EMAIL_ADDR, TCH_LAST_NAME, TCH_FIRST_NAME, CC_TERMID
    FROM ZPS_CCRAW
    WHERE CC_TERMID IN (@TERMS)

当然我得到错误:"Error converting data type nvarchar to numeric"。我试过 CAST/CONVERT CC_TERMID 到这样的 nvarchar:

    SELECT TCH_EMAIL_ADDR, TCH_LAST_NAME, TCH_FIRST_NAME, CC_TERMID
    FROM ZPS_CCRAW
    WHERE CAST(CC_TERMID AS NVARCHAR(50)) IN (@TERMS)

但是我没有返回任何结果。如果我删除 @TERMS 并输入 2700,2701,2703,2704,那么我将按预期返回数据。

在撰写陈述方面,我远不是专家。我知道足以让我陷入这样的麻烦,但还不足以知道如何摆脱它。任何人都可以帮助我实现我正在寻找的东西吗?

请原谅我,我对 Oracle 不是很擅长,所以我对您的子查询所做的更改可能不太奏效。但基本上这个想法是,不要序列化列表。将其保留为设置数据即可。

  DECLARE @TERMS table (Id int)

  insert into @TERMS (Id)
  SELECT ID FROM OPENQUERY
  (
      POWERSCHOOL,
      'SELECT DISTINCT ID 
       FROM TERMS
       WHERE SYSDATE + (SELECT FIRSTDAY - SYSDATE
                        FROM TERMS
                        WHERE ISYEARREC = 1 AND YEARID = (SELECT MAX(SUBSTR(TERMID, 1,2))
                                                          FROM CC) AND SCHOOLID = 51) BETWEEN FIRSTDAY AND LASTDAY AND SCHOOLID = 51'
  )

然后将您的后续查询更改为如下内容:

 SELECT TCH_EMAIL_ADDR, TCH_LAST_NAME, TCH_FIRST_NAME, CC_TERMID
 FROM ZPS_CCRAW
 WHERE CC_TERMID IN (select Id @TERMS)

 SELECT TCH_EMAIL_ADDR, TCH_LAST_NAME, TCH_FIRST_NAME, CC_TERMID
 FROM ZPS_CCRAW a
 INNER JOIN @TERMS b
      on a.CC_TERMID = b.Id

请注意,如果您愿意,您可以直接从 OPENQUERY 执行相同的操作,而不是将它们转储到 table 变量中。

基本上发生的事情是你有一个 table 看起来像...

... CC_TERMID
... 2700
... 2701
... 2703
... 2704 

...你现在说的是“给我所有 CC_TERMID 等于字符串文字 "2700,2701,2703,2704"

的行

您的 Oracle 查询没有问题。这是 SQL 服务器解释语句的方式。自从我使用 SQL 服务器以来已经有一段时间了,但我认为您不能以这种方式使用变量。我会使用动态查询,因此 @terms 将被解释为值列表而不是字符串。