0

这是 Sql Server 中一个有趣的问题;我有一个存储过程,执行时返回以下错误:

“MyTable”类型已经存在,或者您没有创建它的权限。

我认为 MyTable 类型没有正确创建,我的猜测是基于其他类型(例如 nvarchar)都是蓝色的,而当我将鼠标悬停在 @T 声明上方时(DECLARE @T AS MyTable) ,它说@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 回答