sql - 如何在存储过程中将表声明为参数

标签 sql sql-server stored-procedures

<分区>

存储过程抛出错误

Must declare a table variable

在存储过程中,我从调用此存储过程的 UI 中获取表名。我不想在存储过程中创建表变量。如果有人有想法,将不胜感激。谢谢。

存储过程如下:

ALTER PROCEDURE [dbo].[usp_Rates_GET_CustomOFCLData]
    @returnOrigin VARCHAR(256),
    @returnDest   VARCHAR(256)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        *,
        'o' as LocationType   
    FROM 
        @returnOrigin

    UNION ALL

    SELECT 
        *,
        'd' as LocationType  
    FROM 
        @returnDest
END

最佳答案

将表值参数传递到存储过程

首先,您必须为存储过程要使用的表变量定义用户定义类型。

CREATE TYPE KeyTable AS TABLE ([Key] INT)

然后,您可以将该类型用作存储过程的参数(READONLY 是必需的,因为仅支持 IN 并且无法更改表)

CREATE PROC usp_PassTable
    @Keys KeyTable READONLY
AS
BEGIN
    SET NOCOUNT ON
    SELECT * FROM @Keys
END
GO

然后可以直接从 SQL 使用表变量调用存储过程。

DECLARE @Keys KeyTable
INSERT @Keys VALUES (1), (2)
EXEC usp_PassTable @Keys

注意:如果您使用的是 .NET,则可以从与用户定义类型匹配的 DataTable 类型传递 SQL 参数。

查询的示例输出:

Key
-----------
1
2

关于sql - 如何在存储过程中将表声明为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52900372/

相关文章:

sql - SQL Server 中的列分组

sql - 应该创建哪些索引来优化具有多个OR条件的sql查询

sql - 如何根据范围从 1 到 69 的数字列表创建包含 5 个数字排列的列表?

sql - SQL Server 存储过程中的参数化 WHERE 子句

sql - 元组约束

sql - 获取从 C# (oracle) 调用的插入语句使用的序列号

sql - 使用 INSERT INTO ... SELECT 时避免重复字段名称

sql-server - 在 T-SQL 中使用月份名称显示日期时间

php - 如何使用 PHP 中的过程获取数据?

java - 字段列表中的列不明确