0

これは、Sql Server の興味深い問題です。実行時に次のエラーを返すストアド プロシージャがあります。

タイプ 'MyTable' は既に存在するか、作成する権限がありません。

タイプ MyTable が適切に作成されていないと思います。この推測は、@T 宣言 (DECLARE @T AS MyTable) の上にマウスを置くと、他のタイプ (nvarchar など) はすべて青色で表示されるという事実に基づいています。 、 @T のデータ型が無効であると表示されます。

sproc のバージョンは次のとおりです。

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, @v1=@column_name, @T=@table_name, @calcOUT=@calc OUTPUT;

END
GO
4

1 に答える 1

2

サンプル コードに多数の構文エラーがあります。あなたが例を短くしたときにそれが起こったと仮定しているので、それらについて話すつもりはありません.

あなたの主な問題は、CREATE TYPE MyTable TABLE(..)コマンドがデータベースにオブジェクトを作成することです。この型はプロシージャに対してローカルではなく、プロシージャの終了後もデータベースに残ります。次にプロシージャを実行すると、タイプが実際にすでに存在するため、見たエラーが表示されます。

create type ステートメントを削除するだけで問題ありません。

インテリセンスに関しては、本当に信頼することはできません。実行のみが、ステートメントが正しいかどうかを示します。他社が販売している代替品を使用できます。彼らはより良い傾向がありますが、私が出会ったものは完璧ではありません.

于 2013-01-05T16:29:10.410 に答える