这是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
答案 0 :(得分:2)
示例代码中有一堆语法错误。我假设你缩短了这个例子,所以我不打算谈论它们。
您的主要问题是CREATE TYPE MyTable TABLE(..)
命令在数据库中创建了一个对象。此类型不是过程的本地类型,并在过程完成后保留在数据库中。下一次执行该过程时,您将看到您看到的错误,因为该类型确实已经存在。
只需删除创建类型语句就可以了。
至于intellisense,你永远不会真正相信它。只有执行才能告知您的陈述是否正确。您可以使用其他公司销售的替代品。他们往往更好,但我遇到的非完美。