【发布时间】:2022-08-06 00:30:06
【问题描述】:
我正在创建一个 SQL 函数来报告,我收到的参数是几个字符串,其中包含由, 分隔的 PK 示例:
@ID_Model_list = \'1,2\'
@ID_Station_list = \'1,4,7,8,10\'
在我的 SQL 查询中,我执行了一个子查询,我将收到的变量转换为一列,例如:
SELECT CAST(VALUE AS INT) AS ID FROM string_split(@ID_Model_list,\',\')
将等同于:SELECT CAST(value AS int) AS ID FROM string_split(\'1,2\',\',\')
结果:
如果我将上面的代码添加到我的查询中,它只需要子查询产生的列的第一个值
CREATE FUNCTION V_Scrap_Report
(@ID_Model_list varchar, @ID_Station_list varchar, @fecha datetime, @fechafin datetime)
RETURNS TABLE
AS RETURN
(SELECT S.IDScrap
, S.fecha
, M.modelo
, E.estacion
, C.correccion
, S.elemento
, P.nombre
, P.numeroparte
, Sp.cantidad
FROM dbo.Scrap S
FULL OUTER JOIN dbo.Modelo M ON S.IDModelo = M.IDModelo
FULL OUTER JOIN dbo.Estacion E ON E.IDEstacion = S.IDEstacion
FULL OUTER JOIN dbo.Scrapcorreccion Sc ON S.IDScrap = Sc.IDScrap
FULL OUTER JOIN dbo.Correccion C ON C.IDCorrecion = Sc.IDCorrecion
FULL OUTER JOIN dbo.Scraparte Sp ON S.IDScrap = Sp.IDScrap
JOIN dbo.Parte P ON Sp.IDParte = P.IDParte
WHERE S.fecha >= @fecha
AND S.fecha <= DATEADD(HOUR,23.9999,@fechafin)
AND S.IDModelo = (SELECT CAST(VALUE AS INT) AS ID FROM string_split(@ID_Model_list,\',\'))
AND S.IDEstacion = (SELECT VALUE FROM string_split(@ID_Station_list,\',\')))
上面的函数只在S.IDModelo = 1ANDS.IDEstacion = 1没有考虑到有以下情况时才返回结果:
S.IDModelo = 2 AND S.IDEstacion = 1
S.IDModelo = 1 AND S.IDEstacion = 4
S.IDModelo = 1 AND S.IDEstacion = 7
S.IDModelo = 1 AND S.IDEstacion = 8
S.IDModelo = 2 AND S.IDEstacion = 10
当我调用该函数时,我会这样做:
SELECT * FROM V_Scrap_Report(\'1,2\',\'1,4,7,8,10\',\'2022-07-18\',\'2022-07-20\')
古怪的,如果我将... V_Scrap_Report(\'1,2\'... 更改为... V_Scrap_Report(\'2,1\'...,只需带上
S.IDModelo = 2 AND S.IDEstacion = 1
查询中可能缺少什么以免跳过匹配项?
-
而不是
=,您是否考虑过in? -
(@ID_Model_list varchar,仔细看。你认为这个字符串参数的长度是多少? -
DATEADD(HOUR,23.9999,@fechafin)这并不像您认为的那样。文档对第二个参数的数据类型有什么说明?它被评估为一个 int。转换为 int 时 23.9999 是什么? -
斯图有同样的结果
-
当您的
WHERE强制从表Scrap中找到行并从Scraparte中找到一行时,您为什么在这里使用FULL OUTER JOINs,因为必须找到Parte中的一行并且Scraparte是在其ON中使用。
标签: sql sql-server