【问题标题】:Invalid Object Name for Temp Table in Stored Procedure存储过程中临时表的对象名称无效
【发布时间】: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


【解决方案1】:

我知道这不是你的情况,但为了不要忘记,将 Biztalk WCF-Custom 适配器与 SQL 绑定和临时表一起使用也存在限制。

根据本网站: http://thoughtsofmarcus.blogspot.com/2010/11/calling-stored-procedures-from-biztalk.html

在创建临时表并将其插入之前,您需要设置 FMTONLY OFF 在从它们中选择之前设置 FMTONLY ON,如下面的示例所示。

ALTER PROCEDURE [dbo].[FetchTestData]
(@a4 varchar(4))
AS
DECLARE @FmtOnlyIsSet bit = 0
IF (1=0) BEGIN SET @FmtOnlyIsSet = 1 END
IF @FmtOnlyIsSet = 1
   SET FMTONLY OFF

SELECT t1, t2, t3 INTO #temp01 FROM Table_1

IF @FmtOnlyIsSet IS NULL
   SET FMTONLY ON

SELECT t1, t2, t3 FROM #temp01

RETURN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多