2013-01-05 38 views
0

這裏是Sql Server中的一個有趣問題;我有一個存儲過程,執行時返回以下錯誤:創建表類型並將值分配給sproc中的該類型的變量

The type 'MyTable' already exists, or you do not have permission to create it.

我覺得MyTable的未正確創建的類型,我基地這樣一個事實,其他類型的這個猜測(nvarchar的,例如)都當我將鼠標懸停在@T聲明(DECLARE @T AS MyTable)上時,它表示@T具有無效的數據類型。

這裏是存儲過程的一個版本:

CREATE PROCEDURE SPXXX 
AS 
BEGIN 


DECLARE @calc numeric(18,2) 
DECLARE @sql nvarchar(1500), @column_name nvarchar(50), @table_name nvarchar(50), @prmDef nvarchar(1500) 
DECLARE @v1 nvarchar(50), @v2 nvarchar(50) 
DECLARE @T AS MyTable 

Set @column_name = 'EID' 
Set @table_name = 'CTRY_S' 
Set @sql = N'Select @calcOUT = SUM(datalength(@v1))/2 from @T'; 
Set @prmDef = '@v1 nvarchar(50), @calcOUT numeric(18,2) OUTPUT'; 
EXECUTE sp_executesql @sql, @prmDef, @[email protected]_name, @[email protected]_name, @[email protected] OUTPUT; 

END 
GO 
+0

刷新您的智能感知緩存。您發佈的錯誤消息中的「Ctrl + Shift + R」聽起來像是存在的。你發佈的程序雖然是無效的語法。你不應該試圖在程序本身中創建這種類型。 –

回答

2

你有一堆語法錯誤的示例代碼。我假設你縮短了這個例子的時候發生了,所以我不會談論它們。

您的主要問題是,CREATE TYPE MyTable TABLE(..)命令在數據庫中創建一個對象。這個類型對程序來說不是本地的,並且在程序結束後停留在數據庫中。下次該過程執行時,您將看到您看到的錯誤,因爲該類型確實已經存在。

只要刪除create type語句,你應該沒問題。

至於intellisense,你永遠無法真正相信它。只有執行會告訴你的陳述是否正確。您可以使用其他公司出售的替代品。他們往往更好,但我遇到的不完美是完美的。

+0

謝謝Sebastian,很高興知道CREATE TYPE不是本地的存儲介質 - 我做了一個測試,很高興能證實這一點,因爲當你是一個新手時每一個小發現。但我仍然遇到這個錯誤:必須聲明表變量「@T」。 (我目前正在使用我發佈的小貼子,當我解決這個問題時,我會將其整合到更廣泛的背景下 - 這就是我通常的操作方式)。如果你有其他國旗,請舉起它們!謝謝。 – Sam

+0

你的@permDef字符串需要聲明所有傳遞的參數。 @T不在那裏 - 只需添加「@T MyTable READONLY」。 –

相關問題