使用来自另一个存储过程的交叉应用调用存储过程会导致错误SQL服务器

时间:2018-04-12 09:43:12

标签: sql sql-server cross-apply

我一直在尝试从另一个存储过程调用存储过程。现在的问题是,在嵌套的嵌套存储过程中包含带有临时表的CROSS APPLY,并且当我直接执行它时它运行正常。

但是当我尝试从其他SP调用此SP时,会出现错误,其中一列无效。 “在这种情况下,列名''级别'无效。”

另外,当我通过传递参数调用SP SQL窗口执行此SP时,它运行正常,整个主程序开始顺利运行。

我无法理解为什么会出现此问题。以下是一种实施方式供参考。 1.)主要SP

CREATE STORED PROCEDURE ....

INSERT INTO #TempTable
EXEC [Child_SP] @Param1 = 1, @Param2 = 1
...

给出错误。 2.)一旦我执行下面作为单个语句给出一次从主PS。它开始正常工作。

EXEC [Child_SP] @Param1 = 1, @Param2 = 1

3。)子SP与其中一个临时表具有CROSS APLLY。如下所示。

SELECT ID, '1,2,3,4,5' AS levels
INTO #Temp1
FROM ABC

SELECT ID
FROM #Temp1 x0
CROSS APPLY (SELECT * FROM dbo.iter_charlist_to_table(x0.levels, ',') AS x) x1 
WHERE x1.listPos > 1

“iter_charlist_to_table”是表值函数,它从逗号分隔列表中获取值作为表。

无论如何它是否与SQL Thread有关或者是什么问题?感谢。

1 个答案:

答案 0 :(得分:0)

我建议使用此代码将tmp表放在SP的开头,因为插入INTO将始终尝试创建表并不重要(如果已存在)。

IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL DROP TABLE #Temp1

如果您分享更多代码将更有助于理解。

为了防止忘记将别名放在桌面上,有时可能不需要进行此更正,但这是避免查询连接表上数据时出现问题的好方法

SELECT x0.ID
FROM #Temp1 x0
CROSS APPLY (SELECT fnAlias.* FROM dbo.iter_charlist_to_table(x0.levels, ',')  fnAlias) x1 
WHERE x1.listPos > 1