【问题标题】:Unable to drop table from inside a stored procedure无法从存储过程中删除表
【发布时间】:2014-06-25 14:15:13
【问题描述】:

我有一个存储过程,每次从 select into 语句中创建一个临时表。

问题是程序在运行时出现以下错误:

无法删除表“#Temp”,因为它不存在或您没有权限。

这只发生在存储过程中,当我在管理工作室中对其进行测试时,它工作得很好。

我尝试为运行该过程的帐户赋予 db_owner 角色,但没有任何区别。

*我已经删除了 alter procedure 部分,这是我在

中使用的代码
   USE [DBName]
GO
/****** Object:  StoredProcedure [dbo].[PL_Vehicles_Search]    Script Date: 25/06/2014 14:52:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Stored Procedure
-- Description:
-- Version:
-- ModifiedBy:
-- Date Modified:
-- =============================================

ALTER PROCEDURE [dbo].[PL_Vehicles_Search]
    @PageSize INT = 10 ,
    @CurrentPage INT = 1 ,
    @SortExpression NVARCHAR(MAX) = 'RegNumber' ,
    @SearchText NVARCHAR(250) = '' ,
    @SearchSite NVARCHAR(1) = '1'
AS
    BEGIN


        SET @PageSize = 10
    SET @CurrentPage = 1
    SET @SortExpression = 'RegNumber'
    SET @SearchText = ''
    SET @SearchSite = '1'


            DECLARE @PageID INT
        SET @PageID = 245
        DECLARE @Cols VARCHAR(max)

        DECLARE @sqlstring NVARCHAR(MAX)
        DECLARE @UpperBand INT
        DECLARE @LowerBand INT
        DECLARE @RealCol NVARCHAR(MAX)

        SET @LowerBand = ( @CurrentPage - 1 ) * @PageSize
        SET @UpperBand = ( @CurrentPage * @PageSize ) + 1



        IF EXISTS ( SELECT  [name]
                    FROM    tempdb.sys.tables
                    WHERE   [name] LIKE '#Temp%' )
            BEGIN
                DROP TABLE #Temp;
            END



            --DATA


        SELECT  V.VehID,
                V.RegNumber,
                V.FleetNumber,
                VT.VehTypeCode,
                VT.[Description] AS 'VehTypeDesc',
                V.Driver,
                V.VehicleConfirmed
        ,ROW_NUMBER() OVER (Order By @SortExpression ) As RowNumber
        INTO    #Temp
        FROM    dbo.Vehicles V
        INNER JOIN dbo.VehicleTypes VT
        ON V.VehicleTypeID = VT.ID
        WHERE (@SearchText = '' OR V.RegNumber LIKE '%' + @SearchText + '%')

              --  SELECT  *
        --FROM    #Temp

        EXEC dbo.PL_GetColumns @PageID, @Cols OUTPUT


        --END


        --DATA


    SET @sqlstring = 'SELECT ' + @Cols + ' FROM #Temp WHERE ROWNUMBER > '
                + CONVERT(VARCHAR, @LowerBand) + ' AND ROWNUMBER < '
                + CONVERT(VARCHAR, @UpperBand) + ' ORDER BY #Temp.'
                + @SortExpression + ''

            EXEC sp_executesql @sqlstring


        SELECT  [Text]
        FROM    dbo.CustomerLocalizationColumns CLC
                INNER JOIN Portal.dbo.[Columns] C ON CLC.ColumnID = C.ID
        WHERE   C.PageID = @PageID



    END

【问题讨论】:

    标签: asp.net sql stored-procedures ssms


    【解决方案1】:

    如果您在存储过程中创建一个本地临时表(Single #),那么在存储过程完成执行后,它会删除本地临时表。因此,如果您在执行存储过程后尝试删除该表,该表将不再存在,因为它已经被删除了。

    如果您需要在多个位置访问表,请考虑使用全局临时表(以 ## 开头)。

    【讨论】:

    • 你只是一针见血。我没有意识到 SP 会删除本地表,所以我所要做的就是删除我的 drop table 命令。
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2014-06-04
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多