我是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}}时,我注意到了一些奇怪的事情。说期待变量。当我为变量编写代码时,旧错误仍在继续。我认为这可能会有所帮助。
答案 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>刷新本地 缓存。如上所述,您可能需要等待缓存完全加载, 取决于元数据的大小和涉及的其他资源......
...在以下网页上......
这个建议在MSDN上得到了回应,另外还有一些建议:
https://msdn.microsoft.com/en-us/library/ms173434.aspx
IntelliSense功能不包括由其创建的数据库对象 编辑器窗口连接到数据库后的另一个连接。
我无法确定刷新IntelliSense缓存是否会对实际尝试创建存储过程时引发的错误产生任何影响,但由于SMSS的重新启动解决了问题而脚本没有其他更改,因此会出现缓存问题关于正确。
答案 2 :(得分:0)
同样的代码对我也有用。但BEGIN
和END
之间没有任何陈述。请尝试添加类似这样的语句
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。等待片刻,问题就解决了:)