使用用户定义的表类型时,数据类型无效

时间:2014-01-02 11:36:38

标签: sql sql-server database stored-procedures sql-types

我是SQL Server 2008中的表值参数的新手。我试图用查询创建用户定义的表

USE [DB_user]
GO
CREATE TYPE [dbo].[ApproveAddsIds] AS TABLE(
    [Ids] [bigint] NULL
)
GO 

当我尝试在存储过程中使用表类型时

USE [DB_user]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create  PROCEDURE [dbo].[GetTopTopic]
    @dt  [dbo].[ApproveAddsIds] READONLY      
AS
BEGIN

END

我有两个错误_

  

@dt的数据类型无效
  参数@dt不能被声明为只读,因为它不是表值参数。

所以我试图弄清楚这背后的原因,因为第一个查询成功执行我认为它是因为权限而已经尝试过了

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO

但是错误仍在继续,不知道这有什么不对。

当我在,上面的@dt [dbo].[ApproveAddsIds] READONLY错误被删除之后放置AS并且现在错误在{{1}}时,我注意到了一些奇怪的事情。说期待变量。当我为变量编写代码时,旧错误仍在继续。我认为这可能会有所帮助。

5 个答案:

答案 0 :(得分:15)

我遇到了这个确切的问题。 我只是确保在SQL Server中保存了所需的所有内容并重新启动了SQL Server Management Studio。

重新启动后,错误不再出现。我正在使用SQL Server 2012,但我不明白为什么这不适用于2008年。

答案 1 :(得分:1)

在一个查询窗口中创建新的用户自定义表类型(UDTT)然后尝试在另一个查询窗口中创建新的存储过程后,我遇到了同样的问题。根据这个问题的另一个答案,我通过重新启动SQL Server Management Studio解决了这个问题。然而,由于我还有许多其他工作正在进行中,因此我不得不重新启动应用程序。

在我的情况下,我注意到SSMS中的IntelliSense强调了我的UDTT的名称,带有红色波浪线。我找到了以下建议...

  

到目前为止,最常见的情况是您的本地内存缓存是   陈旧。如果您经常使用切换数据库,这可能会更普遍   USE命令,或者数据库是否在其他查询窗口中更改   或其他用户。您可以按Ctrl + Shift + R刷新缓存   或者通过选择菜单选项编辑> IntelliSense>刷新本地   缓存。如上所述,您可能需要等待缓存完全加载,   取决于元数据的大小和涉及的其他资源......

...在以下网页上......

https://www.mssqltips.com/sqlservertip/2591/troubleshooting-intellisense-in-sql-server-management-studio-2012/

这个建议在MSDN上得到了回应,另外还有一些建议:

https://msdn.microsoft.com/en-us/library/ms173434.aspx

  

IntelliSense功能不包括由其创建的数据库对象   编辑器窗口连接到数据库后的另一个连接。

我无法确定刷新IntelliSense缓存是否会对实际尝试创建存储过程时引发的错误产生任何影响,但由于SMSS的重新启动解决了问题而脚本没有其他更改,因此会出现缓存问题关于正确。

答案 2 :(得分:0)

同样的代码对我也有用。但BEGINEND之间没有任何陈述。请尝试添加类似这样的语句

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create  PROCEDURE [dbo].[GetTopTopic](
   @dt  [dbo].[ApproveAddsIds] READONLY  
      )   
AS
BEGIN
--Write some statements here
print 'hi'
END

答案 3 :(得分:0)

我遇到了同样的问题。它确实与IntelliSense有关。以下是我为解决此问题而执行的步骤。我正在使用SQL Management Studio 2017。

1)在“存储过程”的“代码编辑器”窗口中,右键单击。

2)从快捷菜单中选择" IntelliSense Enabled"

之后代码编辑器没有显示任何错误。希望这会有所帮助。

答案 4 :(得分:0)

我知道我参加聚会的时间很晚,但是实际上您看到的是SSMS Intellisense的问题,您可以轻松解决它,而无需重新启动整个SSMS。只需按CTRL-SHIFT-R。等待片刻,问题就解决了:)