2012-10-02 42 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中创建自定义数据类型为它在不同的数据库来识别。