2012-10-02 89 views
2

我有一個過程,一些自定義類型的一些數據給它:過程不知道自定義類型

CREATE TYPE StringList AS TABLE 
(Value NVARCHAR(255)); 

GO 

CREATE TYPE KeyValueList AS TABLE 
(
Id uniqueidentifier, 
Value NVARCHAR(255)); 

GO 

CREATE PROCEDURE 
#update_AttributeFormel(
    @modelPrefix NVARCHAR(255), 
    @definitionNeutralName NVARCHAR(255), 
    @newFormula NVARCHAR(255), 
    @providersToRemove StringList READONLY, 
    @providersToAdd KeyValueList READONLY) 
    AS .... 

的ManagementStudio不顯示任何錯誤(因爲它會當我註釋掉類型聲明),但是當我執行腳本,我發現了以下錯誤:

Msg 2715, Level 16, State 3, Procedure #update_AttributeFormel, Line 2 
Column, parameter, or variable #4: Cannot find data type StringList. 
Parameter or variable '@providersToRemove' has an invalid data type. 
Msg 2715, Level 16, State 3, Procedure #update_AttributeFormel, Line 2 
Column, parameter, or variable #5: Cannot find data type KeyValueList. 
Parameter or variable '@providersToAdd' has an invalid data type. 

實施爲解釋在這裏:

  1. http://www.simple-talk.com/sql/t-sql-programming/temporary-tables-in-sql-server/

  2. http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters

有沒有人有一個想法,爲什麼出現這種情況?

回答

3

我很確定這是由於在tempdb空間中創建過程,使用CREATE PROCEDURE #update_AttributeFormel。當這些類型和過程在同一個數據庫中時,請參見SQL Fiddle它完美地工作。

的代碼如下複製:

CREATE TYPE StringList AS TABLE 
(Value NVARCHAR(255)); 
GO 

CREATE TYPE KeyValueList AS TABLE 
(
Id uniqueidentifier, 
Value NVARCHAR(255)); 
GO 

CREATE PROCEDURE update_AttributeFormel(
    @modelPrefix NVARCHAR(255), 
    @definitionNeutralName NVARCHAR(255), 
    @newFormula NVARCHAR(255), 
    @providersToRemove StringList READONLY, 
    @providersToAdd KeyValueList READONLY) 
AS 
SELECT * FROM @providersToRemove 
GO 

declare @SL StringList; 
insert @SL select 'abcdef' union all select 'ok'; 
declare @KVL KeyValueList; 

exec update_AttributeFormel null,null,null,@SL,@KVL; 
+0

啊讓人心動!有沒有辦法創建類似臨時類型的東西? –

+0

我們決定不創建臨時過程,而是創建存儲過程,並在遷移過程結束時刪除它們(以及類型)。但我認爲你的回答是正確的。謝謝! –

+0

獎勵:用戶定義的類型出現在數據庫中的模式特有的,而不僅僅是數據庫本身。 –

-1

你必須在tempdb中創建自定義數據類型爲它在不同的數據庫來識別。

相關問題