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

时间:2018-10-19 21:54:45

标签: sql sql-server stored-procedures

存储过程抛出错误

  

必须声明一个表变量

在存储过程中,我从调用此存储过程的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

2 个答案:

答案 0 :(得分:3)

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

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

CREATE TYPE KeyTable AS TABLE ([Key] INT)

然后,您可以将该类型用作存储的proc的参数(由于仅支持READONLY并且无法更改表,因此需要IN

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

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

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

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

查询的输出示例:

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

答案 1 :(得分:3)

根据您的代码,我认为您正在寻找DynamicSQL而不是表值参数

ALTER PROCEDURE [dbo].[usp_Rates_GET_CustomOFCLData]
    @returnOrigin SYSNAME,
    @returnDest   SYSNAME
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(MAX) = N'
             SELECT *,''o'' as LocationType   FROM '+ @returnOrigin +
             ' UNION ALL
             SELECT *,''d'' as LocationType  FROM ' + @returnDest;

    EXECUTE sp_executesql @SQL;
END

Using Special Data Types

  

系统名称数据类型用于存储对象名称的表列,变量和存储过程参数。 sysname的确切定义与标识符规则有关。因此,它在SQL Server实例之间可能有所不同。 sysname在功能上与nvarchar(128)相同,只是默认情况下sysname为NOT NULL。在早期版本的SQL Server中,sysname定义为varchar(30)。