1. 程式人生 > >There is already an object named '#xxxx' in the database.

There is already an object named '#xxxx' in the database.

這個案例是前幾天同事遇到的一個案例,在儲存過程中刪除了一個臨時表,然後重新建立這個臨時表時遇到There is already an object named 'xxxx' in the database."這樣的錯誤。下面簡單演示一下這個案例(不用儲存過程,而是直接用簡單的SQL語句重現)

 

 

CREATE TABLE #temp_test( id INT, name VARCHAR(32));
 
 
IF  EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE
name='#tmp_test')
BEGIN
    DROP TABLE #temp_test;
END
GO
 
 
CREATE TABLE #temp_test( id INT, name VARCHAR(32));

 

 

clip_image001

 

 

 

   同事很是不解,問我為什麼在儲存過程裡面刪除了這個臨時表居然不能重建呢? 其實這裡面並沒有什麼玄機,而是僅僅犯了邏輯錯誤。上面這個SQL語句,其實永遠也不會刪除這個臨時表。

 

 

   原因很簡單,臨時表#temp_test在tempdb..sysobjects裡面儲存的名字為#temp_test_________________________________________________________________0000000000EE,所以上述指令碼犯了一個邏輯錯誤: 開發人員以為臨時表被刪除了,其實實質上永遠不會執行DROP TABLE #temp_test這句SQL。儲存在tempdb的sysobjects表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字字尾組成。為了允許追加字尾,為本地臨時表指定的table_name不能超過 116 個字元(關於為什麼是116字元,也是有原因的,此處不展開)

 

 

Both regular and delimited identifiers must contain from 1 through 128 characters. For local temporary tables, the identifier can have a maximum of 116 characters.

 

clip_image002

 

 

那麼為什麼資料庫自動會給臨時表這樣命名呢? 因為本地臨時表是對當前連線(當前會話)可見的。但是任意會話都可以建立同樣名字的臨時表,那麼臨時表的元資料在資料庫內部儲存的時候,使用同樣的名字就不能定位和區別,所以設計上,為了區別不同會話下同樣命名的臨時表,在tempdb..sysobjects裡面臨時表會儲存的是資料庫自動生成的名字(#臨時表名+下劃線+12位的十六進位制字元),如下測試所示,在另外一個會話中,我們建立一個同樣名字的臨時表,然後我們去資料庫檢查,你會發現tempdb..sysobjects中有兩個物件,他們名字的字尾是不一樣的。

 

SELECT @@SPID;

GO

CREATE TABLE #temp_test( id INT, name VARCHAR(32));

 

 

clip_image003

 

 

那麼要如何定位、查詢當前會話是否建立了本地臨時表物件呢? 其實使用OBJECT_ID函式就OK了:

 

 

 

IF OBJECT_ID('tempdb..#temp_test' ) IS NOT NULL DROP TABLE #temp_test;

 

 

 

那麼儲存過程中使用上述指令碼刪除本地臨時表,然後重建同樣名字的臨時表就可以了嗎? 事實告訴我們,雖然上面SQL可以找到當前會話建立的本地臨時表刪除,但是如果是在儲存過程裡面,使用這種方式,建立本地臨時表,然後刪除、建立,依然會遇到這個錯誤,如下測試所示:

 

 

 

CREATE PROCEDURE PRC_TEST
AS
BEGIN 
 
    IF OBJECT_ID('tempdb..#temp_test' ) IS NOT NULL DROP TABLE #temp_test;
    CREATE TABLE #temp_test( id INT, name VARCHAR(32));
 
    INSERT INTO #temp_test VALUES(10, 'jimmy');
 
    IF OBJECT_ID('tempdb..#temp_test' ) IS NOT NULL DROP TABLE #temp_test;
 
    CREATE TABLE #temp_test( id INT, name VARCHAR(32));
 
    INSERT INTO #temp_test VALUES(100, 'kerry');
 
 
    DROP TABLE #temp_test;
END
GO

 

 

clip_image004

 

 

其實在一個批處理裡面執行下面SQL語句也會報錯,但是改寫一下SQL,在刪除後面加上一個GO語句,那麼這樣是不會報錯的(但是你單個SQL,一條一條執行是不會報錯的).

 

 

    CREATE TABLE #temp_test( id INT, name VARCHAR(32));

 

    INSERT INTO #temp_test VALUES(10, 'jimmy');

 

    IF OBJECT_ID('tempdb..#temp_test' ) IS NOT NULL DROP TABLE #temp_test;

 

    CREATE TABLE #temp_test( id INT, name VARCHAR(32));

 

    INSERT INTO #temp_test VALUES(100, 'kerry');

 

 

    DROP TABLE #temp_test;

 

 

 

clip_image005

 

 

至於原因是什麼呢?網上有種分析是因為解析錯誤(parse error),這裡我也傾向於這種說法,因為測試過程中,發現其實上面SQL語句報錯,但是實質上,本地臨時表已經在tempdb被刪除了。加上一個GO這種改寫方法,其實使用兩個批處理,下面這樣的SQL是不會報錯的。

 

 

    CREATE TABLE #temp_test( id INT, name VARCHAR(32));

 

    INSERT INTO #temp_test VALUES(10, 'jimmy');

 

    IF OBJECT_ID('tempdb..#temp_test' ) IS NOT NULL DROP TABLE #temp_test;

 

    GO

 

    CREATE TABLE #temp_test( id INT, name VARCHAR(32));

 

    INSERT INTO #temp_test VALUES(100, 'kerry');

 

相關推薦

There is already an object named '#xxxx' in the database.

這個案例是前幾天同事遇到的一個案例,在儲存過程中“刪除”了一個臨時表,然後重新建立這個臨時表時遇到“There is already an object named 'xxxx' in the database."這樣的錯誤。下面簡單演示一下這個案例(不用儲存過程,而是直接用簡單的SQL語句重現) &nbs

C#.net mysql There is already an open datareader associated with this command引發的問題

關閉 close csdn != 定義 spa apt 因此 關鍵字 【參考】There is already an open datareader associated with this command引發的問題 我在語句中並未使用 DataReader,未何也提示

sqlalchemy的報錯: Object 'xxxx' is already attached to session '2' (this is '4')

想進行刪除許可權列表操作,但是調檢視時,出現上面的報錯資訊。 Object '<Auth at 0x798550>' is already attached to session '2' (this is '4') 報錯的問題大致理解是會話繫結物件亂掉了 解決: 一

異常處理:Mybatis報錯:There is no getter for property named &#39;xxxx&#39; in &#39;class xxx&#39;

bat 變量 應該 img 分享 mybatis quest 情況 定義 /1、報錯信息: 2、根據報錯的信息,提示我們少了一個getter方法。那麽我們是不是真的就少了這個getter呢?這個時候更應該去檢查我們的model中是不是有某個詞寫錯了。因為當我們定義的這個變

Property referenced in indexed property path &#39;xxxx&#39; is neither an array nor a List nor a Map; retur

今天做的一個全選向後臺傳遞資料的時候 報的錯,錯誤的意思是 該屬性是個陣列, 不是一個Map,List,然後我試著後臺用一個數組去接收,結果一樣是報錯 解決方法 $.ajax({ type : "POST", dataType : "json",

RN中文網中電影專案出現的問題 TypeError:undefined is not an object(evaluating&#39;e.posters.thumbnail&#39;)

TypeError:undefined is not an object(evaluating'e.posters.thumbnail') This error is located at: in t inRCTView int RCTSrollView int ScrollView

react-native 編譯報錯: undefined is not an object (evaluating &#39;_react2.PropTypes.func&#39;)

情況通報: 因為是我的二維碼模組報錯,提示報錯程式碼如下 重要資訊是下面的紅色字型部分(Android 模擬器紅屏) undefined is not an object (evaluating '_react2.PropTypes.func')<unknown> D:\CDM_POS_AP

react-native 編譯 undefined is not an object (evaluating &#39;_react2.PropTypes.func&#39;)

情況通報: 因為是我的二維碼模組報錯,提示報錯程式碼如下 重要資訊是下面的紅色字型部分(Android 模擬器紅屏) undefined is not an object (evaluating '_react2.PropTypes.func')<unknown> D:\CDM_POS_AP

命令行運行python項目文件,報錯:ModuleNotFoundError: No module named &#39;xxxx&#39; 解決辦法

director .com error 解決 項目文件 因此 分析 根目錄 jenkins 在pycharm中寫好了自動化測試腳本,並能在pycharm中正常運行,由於要考慮到無人值守時能自動執行,執行時就需要脫離pycharm,直接能用命令執行。但是直接用命令執行用例文件

Neither BindingResult nor plain target object for bean name &#39;xxxx&#39; available as request attribute

問題描述: 嚴重: Servlet.service() for servlet [jsp] threw exception java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean

springmvc 傳參Required String parameter &#39;xxxx&#39; is not present

傳參 sent 執行 inf 分享圖片 mage con src control 報錯 請求因該是已經被分配了,但是參數補全,無法被執行 加上這個參數就好了,表示請求參數,可以為空 這樣的好處是,可以進入controller之後再去判斷,比較好定位錯誤spri

ibatis出錯There is no READABLE property named 'ids' in class 'java.lang.String'

ibatis只傳一個引數進行查詢,xml檔案需要判空得時候property要怎麼寫service層xml檔案:判空的時候property寫"value"就行了,ibatis預設的,取參就直接是傳參的名字即可

ReactNative 打的release包閃退之——undefined is not an object (evaluating 'a.View.propTypes.style')?

寫在前面: 這個問題巨坑一個,足足花了我2天時間。 現象描述: 使用react-native run-android 命令打的包能正常安裝在模擬器上執行,一切都是那麼的平靜。然而,我使用gradlew assembleRelease命令打出的生產

[ReactNative]undefined is not an object (evaluating 'ImagePickerManager.showImagePicker')

最近用到ImagePicker,在Android上面可以正常選擇圖片,但是IOS程式就崩潰了。 首先說明一下,一定自己配,別去link!!! !!! 一定自己配,別去link!!! !!! 一定自己配,別去link!!! !!! 下面說一下XCode怎麼解決: 1.按照圖

解決React Native報錯:undefined is not an object (evaluating 'sceneConfig.animationInterpolators')

呼叫this.props.navigator.resetTo出現以下問題 undefined is not an object (evaluating ‘sceneConfig.animationInt

undefined is not an object (evaluating 'dataSource.rowIdentities')

在寫listview的時候出錯,怎麼查都找不到原因,最終發現太粗心了,listview的閉合部分寫錯了! <ListView       dataSource = {this.state.dataSource.cloneWithRows(this.state.data

There is already 'xxxxx' bean method

今天寫程式碼的時候遇到了如下問題 2017-04-26 11:17:02.198 WARN 6411 --- [ main] ationConfigEmbeddedWebAp

iOS XXXXX is not an object file (not allowed in a library)

以libsqlite3.tbd 為例 1.將下圖標註的路徑複製下來 2.根據路徑找到相應的檔案 “commend + shift + G”進入資料夾 3.新增一遍

React Native 出現undefined is not an object (evaluating 'this.props.navigator')

在RN的元件裡面,我們想進行介面跳轉,網上查閱資料,配置程式碼實現如下, <NavigatorIOS ref='nav' style= {styles.container}initialRou

React Native報錯unddefined is not an object(evaluating ‘_reactnative.propTypes’)解決辦法

報錯截圖 原程式是這樣寫的,然後一直出現錯誤,找不到PropTypes, import React,{Component } from 'react'; import { View,