SQL 存储过程 - 表作为参数

Posted

技术标签:

【中文标题】SQL 存储过程 - 表作为参数【英文标题】:SQL stored procedure - table as parameter 【发布时间】:2017-10-04 13:17:50 【问题描述】:

我有一个包含不同表(所有相同结构)的数据库,我想在其中运行一个存储过程,该过程具有定义要查询哪个表的参数。

我似乎无法弄清楚:

CREATE SCHEMA test;
GO

首先我创建了一个架构

CREATE TYPE DataType as TABLE (
    [datetime] [datetime] NULL,
    [testVar] [bigint] NULL)
   GO

然后我创建了表类型

USE [TestDataFiles]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [test].[testing]
(
    -- Add the parameters for the stored procedure here
    @datetime datetime,
    @t DataType READONLY

)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON


select top(10) * 
from @t
where [datetime] > @datetime                

END
GO

然后我创建了存储过程。

Exec test.testing @t = 'table.1', @datetime = '2017-01-01'

但是当我调用它时,我收到以下错误:

消息 206,级别 16,状态 2,程序测试,第 0 行 [批处理开始第 0 行] 操作数类型冲突:varchar 与 DataType 不兼容

同样的情况发生在:

Exec test.testing @t = [table.1], @datetime = '2017-01-01'

我见过一个例子,在 beginselect 之间的过程中,您输入了以下内容:

INSERT INTO table.1
( datetime, testVar)

但是 table.1(或 table.2 等,因为我有一个表格列表)有数据,我不想更改它。

除非我打算像创建 TYPE 一样创建一个虚拟表?

我在网上找到的例子没有用。

【问题讨论】:

听起来您只想传递一个表名并查询该表。这将需要动态 SQL,我相信这就是您想要的。 我找不到任何这样的例子,如果有链接或解释,将不胜感激。本质上,我正在编写将跨不同表调用 SQL 存储过程的 R 代码。我不想为 n 个表创建相同的 SP 【参考方案1】:

为此,您需要使用动态 SQL

基本过程是建立一个字符串来保存你将要执行的语句,然后执行它

declare @SQL nvarchar(1000)
declare @t as nvarchar (1000)
set @t = 'MyTable'
set @Sql = 'Select * from ' + @t
exec sp_executesql @sql

【讨论】:

【参考方案2】:

您必须传递DataType 类型的参数。因此,创建该类型的变量并将其传递给存储过程,如

declare @table1 DataType
INSERT INTO @table1(datetime, testVar) values (..., ...)
Exec test.testing @datetime = '2017-01-01', @t = @table1

【讨论】:

不是插入要更改我的表吗?这些不是临时表,它们是带有数据的固定表 不,如果你想传递表格作为参数你必须使用这个 把一个表变量想象成一个临时表,希望它是有意义的。我赞成,因为这是问题的正确答案,尽管它似乎是一个 XY 问题。 这不起作用,DataType 附近的语法不正确。我在示例中使用了 table1,但我应该放置 table.1(和 table.2 等)。对不起 @Olivia 这里@table1 只是变量的名称。它可以是@somavariable 或任何你想要的。在变量名称之后,您必须指定类型的名称。在这种情况下(根据您的问题)它是DataType。因此,您创建一个变量,将数据添加到变量中,并将此变量作为参数传递给存储过程

以上是关于SQL 存储过程 - 表作为参数的主要内容,如果未能解决你的问题,请参考以下文章

mysql 存储过程 数据库表名字段作为参数传递给存储过程的方法

在 PL/SQL 存储过程中将表作为参数传递

将 Access 表日期值作为参数传递给 SQL Server 存储过程

T-SQL 中具有表参数的存储过程

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?

如何在存储过程中删除一张表,表名是作为参数传入的