在 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 将被解释为值列表而不是字符串。
我在 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 将被解释为值列表而不是字符串。