【发布时间】:2020-11-20 09:44:15
【问题描述】:
我正在尝试使用临时表来更新存储过程中的数据库表。
我的客户抛出了一个关于非法空值的错误,所以我尝试在 SSMS 中进行测试,它告诉我临时表的名称无效(不管我给它起什么名字)。
如果我运行开头并将INSERT INTO SERVICE SELECT S.* 更改为简单的SELECT S.* 并在声明和定义@OldServicesString 之后运行代码(这样我就可以省略ALTER/CREATE PROCEDURE 行),它将完全按预期运行。
这是 SP 的开头:
ALTER PROCEDURE [dbo].[app_CreateNewServicesOldFSD] (@OldServicesStr nvarchar(max)) AS
SET NOCOUNT ON
DECLARE @User char(10) = (SELECT TOP 1 CREATED_BY_USER FROM BATCHLOG WHERE BPROCESS_ID = 3 ORDER BY ID DESC);
DECLARE @LastOldService int = (SELECT MAX(ID) FROM SERVICE);
SELECT TOP 0 * INTO #Service FROM SERVICE;
ALTER TABLE #Service
DROP COLUMN RECNUM;
INSERT INTO #Service exec dbo.app_NewServicesOldFSD
;WITH cteOldFSDsToCreate AS (
SELECT JobID.Item JobID, CONVERT(date,ServDate.Item,103) ServDate
FROM dbo.SplitStringToTable(@OldServicesStr,',',2) JobID
INNER JOIN dbo.SplitStringToTable(@OldServicesStr,',',2) ServDate ON JobID.Rw = ServDate.Rw AND JobID.Cl = 0 AND ServDate.Cl = 1
)
INSERT INTO SERVICE SELECT S.*
FROM #Service S
INNER JOIN cteOldFSDsToCreate N ON N.JobID = S.JOB_ID AND N.ServDate = S.DATE
DROP TABLE #Service
可用且可能的 @OldServicesStr 可能是 '11428,23/07/2019,11429,23/07/2019,15186,5/10/2019'
为了在 SSMS 中测试它,我打开了一个新查询并输入 exec app_CreateNewServicesOldFSD '11428,23/07/2019,11429,23/07/2019,15186,5/10/2019'
并得到以下错误:
警告:空值被聚合或其他 SET 操作消除。 消息 208,级别 16,状态 0,过程 app_CreateNewServicesOldFSD,第 65 行 [批处理开始第 7 行] 对象名称“#Service”无效。
完成时间:2020-11-20T20:36:57.1356921+11:00
【问题讨论】:
-
您遇到的实际错误是什么。
-
@Larnu 刚刚更新了问题。奇怪的是,当我第一次尝试时,它会自动将#Service 解析为“TempService”。这次错误是逐字读取的。
-
第一条消息是警告,提醒您
NULL值不包含在聚合函数中。对于后者,第 65 行是哪一行?上面没有65行。 -
@Larnu 天哪,我觉得很傻 - 我检查了第 65 行,没有找到任何东西,但我一定是男孩子的样子。我只包含了 SP 的这一部分,因为我认为
#Service没有出现在其他任何地方,但是当我检查(显然很糟糕)第 65 行时,我错过了它的位置。我会仔细检查它是否一切正常,然后核对我的自己的问题...
标签: sql-server stored-procedures temp-tables