无法在动态 SQL 中访问临时 table
Cannot access temp table in dynamic TSQL
我正在一些动态 SQL 中创建临时 table。但是当我调用它时它会抛出 "Invalid object name '#Settlement_Data_Grouped'" 错误。
我假设这是因为动态 SQL 使用它自己的独立实例?以至于它被丢弃并且对外部不可用SQL?当我使用 ##Settlement_Data_Grouped 或创建 table 时它起作用。但是,当多人调用存储过程时,这无济于事。
我想我可以检查 table 是否存在,但这意味着我将不得不删除内容,不同的用户可能需要不同的输出,这意味着它不会工作。
那么有没有人有 solution/suggestion 我可以在多人可以调用同一个存储过程的地方使用?
恕我直言,您不需要 Dynamic SQL
。您可以像下面这样更改您的代码,这会给您带来与您尝试完成的相同的结果。请检查是否有任何语法错误(如果有)。我会为您提供完整的查询,但在您的问题中您有屏幕截图而不是代码。就这样吧。
If you want to use 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
If you want to use 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
问题是临时 table 只存在于动态 SQL 执行上下文的范围内。解决方法是在动态 SQL 之外创建临时 table,然后插入其中:
CREATE TABLE #Settlement_Data_Grouped (PartNo varchar(50) ......)
INSERT INTO #Settlement_Data_Grouped
EXEC(@selectSQL)
我正在一些动态 SQL 中创建临时 table。但是当我调用它时它会抛出 "Invalid object name '#Settlement_Data_Grouped'" 错误。
我假设这是因为动态 SQL 使用它自己的独立实例?以至于它被丢弃并且对外部不可用SQL?当我使用 ##Settlement_Data_Grouped 或创建 table 时它起作用。但是,当多人调用存储过程时,这无济于事。
我想我可以检查 table 是否存在,但这意味着我将不得不删除内容,不同的用户可能需要不同的输出,这意味着它不会工作。
那么有没有人有 solution/suggestion 我可以在多人可以调用同一个存储过程的地方使用?
恕我直言,您不需要 Dynamic SQL
。您可以像下面这样更改您的代码,这会给您带来与您尝试完成的相同的结果。请检查是否有任何语法错误(如果有)。我会为您提供完整的查询,但在您的问题中您有屏幕截图而不是代码。就这样吧。
If you want to use
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
If you want to use
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
问题是临时 table 只存在于动态 SQL 执行上下文的范围内。解决方法是在动态 SQL 之外创建临时 table,然后插入其中:
CREATE TABLE #Settlement_Data_Grouped (PartNo varchar(50) ......)
INSERT INTO #Settlement_Data_Grouped
EXEC(@selectSQL)