使用用户定义的表类型与临时存储过程。

3

我在使用用户定义的表类型作为临时存储过程的参数类型时遇到了问题。

我正在数据库中完成所有这些操作,该数据库包含我们的临时表、临时存储过程等任何临时内容。

代码如下:

CREATE TYPE test_type AS TABLE (user int, user_value int) 
GO

CREATE PROCEDURE #test_pro 
    @input test_type READONLY
AS
    SELECT TOP 10 * 
    FROM @input 
GO

我遇到了一个错误:

参数或变量@input具有无效的数据类型。

有没有办法让我在我的临时存储过程中使用数据类型test_type 作为一种类型?不幸的是我只能访问临时存储过程而非永久版本。
另一个问题:使用函数会更好吗?

2
你尝试过在 tempdb 中创建用户定义类型吗? - Martin Smith
我该如何做到这一点?这听起来就像我已经在的地方,因为我提到了我们的临时表存储在数据库中。 - H_1317
我建议你重新考虑使用临时存储过程的想法。这是一个很少使用的功能。 - SMor
1个回答

3

您需要在 tempdb 中创建 UDT。

以下内容可以正常工作。

USE tempdb

GO

CREATE TYPE test_type AS TABLE ([user] int, user_value int)

GO

--Switch database
USE msdb

GO

CREATE PROCEDURE #test_pro @input TEST_TYPE READONLY
AS
    SELECT TOP 10 *
    FROM   @input

GO

EXEC #test_pro

GO

USE tempdb

DROP TYPE test_type

DROP PROC #test_pro 

如果您在 tempdb 中没有 CREATE TYPE 权限,则可以使用 #temp 表替代。例如,以下代码可行:
CREATE PROCEDURE #test_pro 
AS
    SELECT TOP 10 * 
    FROM #input 
GO

GO

CREATE TABLE #input([user] int, user_value int) 

GO

EXEC #test_pro

我在tempdb中没有创建类型权限。我知道我可以在存储过程之外声明我的表,但我希望避免这样做,以便只使用函数/存储过程来保持代码库更加分隔。使用用户定义函数是否会使这一切更可行? - H_1317
@H_1317 - 我不知道你有什么权限和工作条件。我假设你没有权限创建常规的存储过程(因此使用了#temp存储过程)?那为什么你会有权限创建函数呢?或者如果你确实具有CREATE PROC权限来创建常规存储过程,那么你可以在类型所在的同一数据库中创建一个存储过程,问题就解决了。 - Martin Smith
我承认这只是一次冒险尝试。不过还是感谢你的帮助。我需要联系我的管理员。 - H_1317

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接