2017-10-04 192 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問題。 –