web-dev-qa-db-ja.com

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'

ただし、これを呼び出すと、次のエラーが発生します。

メッセージ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のようにダミーテーブルを作成するつもりでない限り?

私がオンラインで見つけた例は役に立たなかった。

5
Olivia

これを行うには、動的SQLを使用する必要があります

基本的な手順は、実行するステートメントを保持する文字列を作成し、それを実行することです。

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

タイプDataTypeのパラメータを渡す必要があります。したがって、そのタイプの変数を作成し、次のようなストアドプロシージャに渡します。

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