• 局部临时表与全局临时表区别与示例


    局部临时表与全局临时表区别与示例

    1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
    2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
    3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。

    示例:

    主存储过程 CreateScheduleConference.sql

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CreateScheduleConference]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[CreateScheduleConference]
    GO
    CREATE PROC dbo.CreateScheduleConference
    (
    @ResouceIds VARCHAR(MAX)
    )
    AS
    BEGIN
     SET NOCOUNT ON
     CREATE TABLE #TmpTbResourceSelect(ResourceId INT)

     INSERT #TmpTbResourceSelect SELECT * FROM dbo.fn_split(@ResouceIds,',')

     EXEC dbo.CheckPhysicsResourceIsValid @ResouceIds

    DROP TABLE #TmpTbResourceSelect ---使用完成后删除临时表
     SET NOCOUNT OFF
    END

    子存储过程  CheckPhysicsResourceIsValid.sql

    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CheckPhysicsResourceIsValid]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[CheckPhysicsResourceIsValid]
    GO
    CREATE PROC dbo.CheckPhysicsResourceIsValid
    (
     @ResourceIds VARCHAR(MAX)
    )
    AS
    BEGIN
     SELECT * FROM #TmpTbResourceSelect
    END

    调用示例

    DECLARE @ResourceIds VARCHAR(MAX)
    SET @ResourceIds = '1,2,3'
    EXEC [dbo].[CreateScheduleConference] @ResourceIds

    结果显示为:

    ResourceId

    1
    2
    3

    如果再用 SELECT * FROM #TmpTbResourceSelect 则出现

    消息 208,级别 16,状态 0,第 1 行
    对象名  '#TmpTbResourceSelect' 无效。

    即使在再改成 USE tempdb
    SELECT * FROM #TmpTbResourceSelect运行后错误提示一样

    如果将#TmpTbResourceSelect定义成##TmpTbResourceSelect时,则再次运行SELECT * FROM ##TmpTbResourceSelect可以得到正确结果

  • 相关阅读:
    python_控制台输出带颜色的文字方法
    Django 知识总结(一)
    C# 实现俄罗斯方块
    一起学SpringMVC之Request方式
    一起学SpringMVC之RequestMapping详解
    一起学SpringMVC之Json
    一起学SpringMVC之注解
    一起学SpringMVC之入门篇
    一起学Android之Xml与Json解析
    一起学Android之AsyncTask
  • 原文地址:https://www.cnblogs.com/fery/p/1808582.html
Copyright © 2020-2023  润新知