无法在动态TSQL中访问临时表

时间:2017-07-18 21:20:30

标签: tsql dynamic-sql

我在一些动态SQL中创建一个临时表。但是当我调用它时会抛出“无效的对象名称'#Settlement_Data_Grouped'”错误。

enter image description here enter image description here

我假设它是因为动态SQL使用它自己的单独实例?那么它被删除而不能用于外部SQL?它在我使用## Settlement_Data_Grouped或创建表时有效。但是当多个人打电话给sproc时,这没有用。

我想我可以检查表是否存在,但这意味着我必须删除内容,不同的用户可能需要不同的输出,这意味着它不起作用。

那么有没有人有一个解决方案/建议我可以使用多个人可以调用相同的sproc?

2 个答案:

答案 0 :(得分:1)

恕我直言,你不需要Dynamic SQL。您可以像下面的内容一样更改代码,这样可以获得与您尝试完成相同的结果。如果有任何语法错误,请检查。我会为您提供完整的查询,但在您的问题中,您有截图而不是代码。所以就这样了。

  

如果您想使用Temp Tables

SELECT
......
INTO #Settlement_Data_Grouped
FROM #Settlement_Data
WHERE (Payment_Date < Settlement_Date AND @outputType = 1) ---This will be true when you have @outputType = 1 
    OR @outputType = 0 ---This will be true when you have @outputType = 0
GROUP BY Part_No
    ,NAME
    ,Order_No
    ,Invoice_No

-------------
SELECT
......
FROM #Settlement_Data_Grouped
  

如果您想使用CTE

WITH Settlement_Data_Grouped
AS (
SELECT
......
FROM #Settlement_Data
WHERE (Payment_Date < Settlement_Date AND @outputType = 1) ---This will be true when you have @outputType = 1 
    OR @outputType = 0 ---This will be ture when you have @outputType = 0
GROUP BY Part_No
    ,NAME
    ,Order_No
    ,Invoice_No
)

SELECT
......
FROM Settlement_Data_Grouped

答案 1 :(得分:1)

问题是临时表仅存在于动态SQL执行上下文的范围内。解决它的方法是在动态SQL之外创建临时表,然后插入其中:

CREATE TABLE #Settlement_Data_Grouped (PartNo varchar(50) ......)

INSERT INTO #Settlement_Data_Grouped
EXEC(@selectSQL)