Sql server 为什么查询结果在存储过程中使用或从SSMS或DBeaver运行查询时不同
我有一个疑问:Sql server 为什么查询结果在存储过程中使用或从SSMS或DBeaver运行查询时不同,sql-server,Sql Server,我有一个疑问: insert into [dbo].[SEELOG_AGG_DETAIL] select SEELOG_TMP.NAME_MUT , SEELOG_TMP.DESCR_MUT , SEELOG_TMP.FUNCT_MUT , SEELOG_TMP.DEPT_MUT , SEELOG_TMP.[TYPE] , SEELOG_TMP.[DATE] , count(*) AS NUMBER_RECO
insert into [dbo].[SEELOG_AGG_DETAIL]
select SEELOG_TMP.NAME_MUT
, SEELOG_TMP.DESCR_MUT
, SEELOG_TMP.FUNCT_MUT
, SEELOG_TMP.DEPT_MUT
, SEELOG_TMP.[TYPE]
, SEELOG_TMP.[DATE]
, count(*) AS NUMBER_RECORDS
, SEELOG_TMP.ACTION
from #SEELOG_TMP SEELOG_TMP with (index(#IDX_SEELOG_TMP_2))
WHERE (SEELOG_TMP.[TYPE] <> 'O')
OR (
SEELOG_TMP.[TYPE] = 'O'
AND SEELOG_TMP.[MODULE] = 'PS'
AND SEELOG_TMP.FUNCT_MUT <> ''
)
OR (
SEELOG_TMP.[TYPE] = 'O'
AND SEELOG_TMP.[MODULE] = 'ZP'
AND SEELOG_TMP.FUNCT = 'LOGIN'
)
GROUP BY
SEELOG_TMP.NAME_MUT
, SEELOG_TMP.DESCR_MUT
, SEELOG_TMP.FUNCT_MUT
, SEELOG_TMP.DEPT_MUT
, SEELOG_TMP.[TYPE]
, SEELOG_TMP.[DATE]
, SEELOG_TMP.ACTION
OPTION (MAXDOP 4);
它使用临时表的内容创建一个普通数据库表,然后对普通表运行查询,得到了一个很好的结果。此查询包括列DEPT_MUT
在反存储过程中,我将列DEPT_MUT从查询中排除,存储过程返回的结果与对普通表运行查询相同
当我从DBeaver或SSMS运行查询时,我得到了预期的结果。但当我将查询放入存储过程时,结果是不同的。当从存储过程运行时,我只得到一行,但当从DBeaver或SSMS运行时,得到所有正确的组
在尝试查询添加和删除一些列时,我发现列DEPT_MUT有空值。从查询中删除此列,然后在存储过程中使用该查询,就可以了
那么,为什么在存储过程中运行时查询结果不同呢
希望有人能回答
提前感谢。如果不了解如何创建和填充临时表,很难说 结果不同的唯一方式是,如果SEELOG_TMP提供不同的输入数据,您确定在SSMS中以及在PROC中以相同的方式计算SEELOG_TMP吗
你能展示一下proc是如何生成它的,而SSMS是如何创建它的吗?基本上我会选择*从SEELOG\u SEELOG到SEELOG\u TMP。当我将代码从SEELOG\u SEELOG更改为select*到dbo.SEELOG\u TMP,然后从我的问题中运行查询时,我会得到一个不同的结果。您需要检查创建SEELOG\u TMP的代码,如果输入不同,那么输出也会不同。您不只是执行into,因为temp表上有索引,还有什么变化正在发生@JaccodeZwartSo在创建van temp表格或使用select into语句创建普通表格时,表格或列是否存在差异?不同之处在于您在临时表中放置了什么,您的问题并不完整,因为它没有显示如何创建临时表。查询结果不同的唯一方式是SEELOG_TMP中的数据不同。
SELECT ISNULL(USER1.NAAM, '') AS [NAME_USR]
,ISNULL(USER1.OMSCHR, '') AS [DESCR_USR]
,ISNULL(USER2.NAAM, '') AS [NAME_MUT]
,CASE
WHEN (ISNULL(USER2.OMSCHR, '') = '')
AND (SEELOG.MODULE = 'ZP')
THEN '-- Zorgportaal --'
ELSE ISNULL(USER2.OMSCHR, '')
END AS [DESCR_MUT]
,CAST(CASE
WHEN (ISNULL(USERFUNK.OMSCHR, '') = '')
AND (SEELOG.MODULE = 'ZP')
THEN ISNULL('-- ' + CASE
WHEN SEELOG.FUNCTIE = 'LOGIN'
THEN CASE
WHEN (
ISNUMERIC(SEELOG.INZAGEINFO) = 0
OR LEN(SEELOG.INZAGEINFO) <> 7
)
AND (LEN(SEELOG.INZAGEINFO) > 0) -- filter op ACTIONURI werkt niet.
THEN SEELOG.FUNCTIE + ' ARTS'
ELSE SEELOG.FUNCTIE
END
ELSE SEELOG.FUNCTIE
END + ' --', '')
ELSE ISNULL(USERFUNK.OMSCHR, '')
END AS NVARCHAR(60)) AS FUNCT_MUT
,ISNULL(USERAFD.OMSCHR, '') AS DEPT_MUT
,SEELOG.LOGUSERID
,LOGSESSI.LOGSESS_ID
,LOGSESSI.WINUSER
,LOGSESSI.WINSTAT
,SEELOG.[TYPE]
,SEELOG.[ACTIONURI]
,SUBSTRING(SEELOG.ACTIONURI,1, ABS( patindex('%/%', SEELOG.ACTIONURI)-1)) as ACTION
,SEELOG.AutoID
INTO #SEELOG_TMP
FROM dbo.SEELOG_SEELOGI SEELOG WITH (READUNCOMMITTED,INDEX (idx_SEELOG_SEELOGI_Primaire_volgorde))
LEFT OUTER JOIN dbo.SEELOG_NDZKKZ NOODKEUZE WITH (READUNCOMMITTED) ON SEELOG.KEUZE = NOODKEUZE.KeuzeID
LEFT OUTER JOIN dbo.ZISCON_LOGUSER LOGUSER WITH (READUNCOMMITTED) ON SEELOG.LOGUSERID = LOGUSER.LOGUSER_ID
LEFT OUTER JOIN dbo.ZISCON_LOGSESSI LOGSESSI WITH (READUNCOMMITTED) ON LOGSESSI.LOGSESS_ID = LOGUSER.LOGSESS_ID
LEFT OUTER JOIN dbo.ZISCON_USER USER1 WITH (READUNCOMMITTED) ON USER1.NAAM = LOGUSER.GEBRUIKER
LEFT OUTER JOIN dbo.ZISCON_USER USER2 WITH (READUNCOMMITTED) ON USER2.NAAM = LOGUSER.MUTGEBRUIK
LEFT OUTER JOIN dbo.ZISCON_USERFUNK USERFUNK WITH (READUNCOMMITTED) ON USER2.FUNKTIE = USERFUNK.CODE
LEFT OUTER JOIN dbo.ZISCON_USERAFD USERAFD WITH (READUNCOMMITTED) ON USERAFD.CODE = USER2.AFDELING
WHERE
SEELOG.AutoId BETWEEN @AutoId_min_search AND @AutoId_max_search
OPTION (FORCE ORDER, MAXDOP 4);
select * info dbo.seelog_tmp from #seelog_tmp