2017-10-04 170 views
0

我有一个数据库与不同的表(所有相同的结构),我想运行存储过程有一个参数,该参数定义要查询的表。SQL存储过程 - 表作为参数

我似乎无法推测出来:

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] Operand type clash: varchar is incompatible with DataType

同样的情况:

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

我已经看到了一个例子,其中beginselect之间的过程中你把这样的东西:

INSERT INTO table.1 
(datetime, testVar) 

但table.1(或table.2等我有一个表的列表)有数据,我不想改变它。

除非我打算创建一个虚拟表,就像我做了TYPE?

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

+3

听起来就像你只是想传递一个表名并查询该表。这将需要动态SQL,我相信是你想要的。 –

+0

我找不到任何这样的例子,链接或解释将不胜感激。本质上,我写的R代码即将跨不同的表调用SQL存储过程。我不想为n个表创建相同的SP – Olivia

回答

4

要做到这一点,你需要使用动态SQL

的基本程序是建立一个字符串,将持有你的声明将执行,然后执行它

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

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

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

isnt插入去改变我的表?这些不是临时表,它们是带有数据的固定表 – Olivia

+1

不,如果您想要传递表作为参数,您必须使用此 – Marusyk

+0

将表变量视为临时表,并且它将有希望。我赞成,因为这是问题的正确答案,尽管它似乎是一个XY问题。 –

相关问题