2013-01-05 40 views
0

这里是Sql Server中的一个有趣问题;我有一个存储过程,执行时返回以下错误:创建表类型并将值分配给sproc中的该类型的变量

The type 'MyTable' already exists, or you do not have permission to create it.

我觉得MyTable的未正确创建的类型,我基地这样一个事实,其他类型的这个猜测(nvarchar的,例如)都当我将鼠标悬停在@T声明(DECLARE @T AS MyTable)上时,它表示@T具有无效的数据类型。

这里是存储过程的一个版本:

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, @[email protected]_name, @[email protected]_name, @[email protected] OUTPUT; 

END 
GO 
+0

刷新您的智能感知缓存。您发布的错误消息中的“Ctrl + Shift + R”听起来像是存在的。你发布的程序虽然是无效的语法。你不应该试图在程序本身中创建这种类型。 –

回答

2

你有一堆语法错误的示例代码。我假设你缩短了这个例子的时候发生了,所以我不会谈论它们。

您的主要问题是,CREATE TYPE MyTable TABLE(..)命令在数据库中创建一个对象。这个类型对程序来说不是本地的,并且在程序结束后停留在数据库中。下次该过程执行时,您将看到您看到的错误,因为该类型确实已经存在。

只要删除create type语句,你应该没问题。

至于intellisense,你永远无法真正相信它。只有执行会告诉你的陈述是否正确。您可以使用其他公司出售的替代品。他们往往更好,但我遇到的不完美是完美的。

+0

谢谢Sebastian,很高兴知道CREATE TYPE不是本地的存储介质 - 我做了一个测试,很高兴能证实这一点,因为当你是一个新手时每一个小发现。但我仍然遇到这个错误:必须声明表变量“@T”。 (我目前正在使用我发布的小贴子,当我解决这个问题时,我会将其整合到更广泛的背景下 - 这就是我通常的操作方式)。如果你有其他国旗,请举起它们!谢谢。 – Sam

+0

你的@permDef字符串需要声明所有传递的参数。 @T不在那里 - 只需添加“@T MyTable READONLY”。 –

相关问题