2011-08-31 65 views
72

我遇到了一些僵局。我有一個由一些C#代碼生成的查詢。在針對相同數據庫運行時,查詢在Microsoft SQL Server Management Studio中正常工作。SQL Server報告「列名無效」,但該列存在,並且查詢通過管理工作室工作

但是,當我的代碼試圖運行相同的查詢時,我得到了關於無效列的相同錯誤,並拋出異常。所有引用此列的查詢都失敗。

最近有問題的列被添加到數據庫。這是一個名爲Incident_Begin_Time_ts的日期欄。

失敗的一個例子是:在代碼運行,因爲它認爲該列丟失時

select * from PerfDiag 
where Incident_Begin_Time_ts > '2010-01-01 00:00:00'; 

Select MAX(Incident_Being_Time_ts);其他查詢也會失敗。

任何想法?

+0

這可能是一個問題嗎?也許Management Studio不關心案例,而其他訪問數據庫的方式則更爲嚴格。 – Oliver

+1

您確定您在代碼中處理的是與Management Studio中相同的數據庫嗎? –

+1

您確定您在C#中創建的列名和您嘗試查詢的列名完全相同嗎?在你的問題中,你寫了兩次'事件_ **開始** _時間__'和一次'事件_ **正在** _時間__'。 –

回答

49

我懷疑你有兩個同名的表。一個屬於模式'dbo'(dbo.PerfDiag),另一個屬於用於連接到SQL Server的帳戶的默認模式(類似於userid.PerfDiag)。

如果對模式對象(例如表格)有一個非限定參照—一個未被模式名稱—限定的對象引用必須解析。名稱解析通過按以下順序搜索具有指定名稱的適當類型(表格)的對象。名稱解析爲第一個匹配項:

  • 在用戶的默認模式下。
  • 在模式'dbo'下。

非限定參考值綁定到上述順序中的第一個匹配項。

作爲一般建議的做法,應該始終資格架構對象的引用,出於性能的考慮:

  • 一個不合格的參考可能會使存儲過程或查詢緩存的執行計劃,因爲綁定引用的架構可能會根據執行存儲過程或查詢的憑據更改。這導致重新編譯查詢/存儲過程,性能受到影響。重新編譯會導致編譯鎖被取出,阻止其他人訪問所需的資源。

  • 名稱解析會降低查詢執行速度,因爲必須進行兩次探測才能解析對象的可能版本(屬於'dbo')。這是通常的情況。單個探測器解析名稱的唯一時間是當前用戶擁有指定名稱和類型的對象。

[編輯,以進一步注]

其他的可能性是(排名不分先後):

  • 你沒有連接到你以爲你是數據庫。
  • 您沒有連接到您認爲自己的SQL Server實例。

仔細檢查您的連接字符串並確保它們明確指定了SQL Server實例名稱和數據庫名稱。

+4

+1我使用sql profiler來跟蹤這些類型的問題。無論何時,您從其他應用程序處理動態sql時,都會使用跟蹤捕獲查詢,將其複製並粘貼到新的查詢窗口中,然後單擊「執行」以找出錯誤。這也將驗證您正在連接到正確的實例和數據庫,如上所示。 – brian

+2

......稍微偏離主題,但如果您使用事件探查器重現性能問題,請記住包含所有設置選項**,特別是ARITHABORT以真正複製查詢(以及它的緩存計劃) –

6

如果您在事務和SQL語句中運行此操作,然後再刪除/更改表,您也可以收到此消息。

158

只需按下Ctrl鍵++[R看看...

在SQL Server Management Studio中,Ctrl+Shift+R refreshes the local cache.

+0

爲什麼你認爲這樣做會有幫助嗎? – Amicable

+5

在SQL Server Management Studio中,Ctrl + Shift + R刷新Intellisense緩存。這確實阻止了Management Studio抱怨我添加的列是無效的,但我認爲這是一個紅鯡魚(從代碼訪問這些新列時,我仍然遇到了問題,就像原始的海報一樣)。 – Giles

+1

似乎每次我添加遷移,然後更新數據庫,我必須這樣做。否則,我會發現這是MS SQL Server中的無效列名稱。作品!非常感謝。 – BriOnH

2

如果您正在使用的變量具有相同的名稱列,這可能是因爲你忘記了'@'變量標記。在INSERT語句中,它將被檢測爲一列。

0

剛剛有完全相同的問題。我將一些臨時表中的別名列重命名,這些臨時表又被相同代碼的另一部分使用。出於某種原因,SQL Server Management Studio沒有捕獲到它,並且抱怨無效的列名。

我只是創建一個新的查詢,將舊查詢中的SQL代碼複製粘貼到這個新查詢中並再次運行。這似乎正確地刷新了環境。

相關問題