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

なぜこれが起こるのか誰かが知っていますか?

4

2 に答える 2

3

これは、 CREATEPROCEDURE#update_AttributeFormelを使用してtempdbスペースにプロシージャを作成したことが原因であると確信しています。タイプとプロシージャが同じデータベースにある場合に完全に機能するこのSQLフィドルを参照してください。

コードは以下に複製されます:

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;
于 2012-10-02T07:29:48.610 に答える
-1

別のデータベースで認識されるように、tempdb でカスタム データ型を作成する必要があります。

于 2014-10-29T18:23:11.400 に答える