【问题标题】:Invalid data type while using user defined table type使用用户定义的表类型时数据类型无效
【发布时间】:2014-01-19 20:22:19
【问题描述】:

我是 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 上时,我注意到了一些奇怪的事情。当我为变量编写代码时,旧错误仍在继续。我认为这可能会有所帮助。

【问题讨论】:

  • Hmmmm... 无法重现 - 对我来说就像一个魅力。你(a)确定你总是在同一个服务器/同一个数据库上吗? (b) 你的存储过程中实际上有一个主体吗? (如果正文中没有任何语句,我会不断收到 'END' 附近的语法不正确
  • @Are you sure you created the table type: CREATE TYPE ... AS TABLE ... ?基本上,错误信息告诉没有[dbo].[ApproveAddsIds]表类型。
  • @marc_s 我在同一台服务器/同一数据库上 n 尝试在正文中打印 hi 但错误继续。
  • @我也这么认为,但是表类型创建成功。
  • 如果您在 SQL Server Management Studio 的对象资源管理器中检查您的数据库,请转到 Programmability > Types > User-Defined Table Types - 您在那里看到您的 ApproveAddsIds 表类型吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • @Bogdan Sahlean 的评论确实有帮助。您确定您创建了表类型:CREATE TYPE ... AS TABLE ... 吗?基本上,错误消息表明没有 [dbo].[ApproveAddsIds] 表类型。 ——博格丹·萨林
    【解决方案3】:

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

    就我而言,我注意到 SSMS 中的 IntelliSense 用红色波浪线在我的 UDTT 名称下划线。我找到了以下建议...

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

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

    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 的重新启动解决了该问题而没有对脚本进行其他更改,因此确实存在缓存问题差不多吧。

    【讨论】:

    • 通过测试确认可能不需要重启 SMSS:(1) 在一个查询窗口中创建一个新的 UDTT,然后 (2) 尝试在另一个查询窗口中的 DECLARE 语句中使用它。 UDTT 被下划线/显示为未知类型,直到 (3) 按 CTRL+SHIFT+R 重新加载 Intellisense 缓存并且一切正常。
    【解决方案4】:

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

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

    【讨论】:

    • 重新启动 SSMS 对我来说适用于 SQL Server 2014。检查是否也选择了正确的数据库。
    • 与版本 18.3.1 相同。它看起来像一个长期运行的错误......
    • 为我工作 :)
    【解决方案5】:

    同样的代码也适用于我。但是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
    

    【讨论】:

    • 我没有从给定的代码中看到任何语法错误。begin 和 end 语句中是否有任何查询?。
    • @HotCoolStud ,上面的代码应该可以正常工作......你面临什么问题......描述性
    • 当我尝试上面的代码时,我遇到了错误dt has an invalid data type Parameter ,dt不能被声明为只读,因为它不是表值参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多