SQL存储过程 - 表作为参数

时间:2017-10-04 13:17:51

标签: sql-server stored-procedures user-defined

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

我似乎无法弄明白:

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'

然而,当我调用它时,我收到以下错误:

  

Msg 206,Level 16,State 2,Procedure test,Line 0 [Batch Start Line 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一样?

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

2 个答案:

答案 0 :(得分:4)

为此,您需要使用动态SQL

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

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

答案 1 :(得分:1)

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

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