我一直在尝试从另一个存储过程调用存储过程。现在的问题是,在嵌套的嵌套存储过程中包含带有临时表的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有关或者是什么问题?感谢。
答案 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