1

SQL Serverデータベースには、次のようなテーブルがあります。

EVENT201201.dbo.EvAcc
EVENT201202.dbo.EvAcc
EVENT201203.dbo.EvAcc
EVENT201204.dbo.EvAcc
EVENT201205.dbo.EvAcc
...
EVENTYYYYMM.dbo.EvAcc

私も持っていDBACCES1.dbo.*ます。私はこのようなクエリを作成しました:

DECLARE @SQL varchar(511)
DECLARE @SQL_ACC varchar(250)
DECLARE @SQL_UClass varchar(250)
DECLARE @SQL_UClassDef varchar(250)
DECLARE @TABLENAME varchar(250)


SELECT @TABLENAME ='EVENT' + CONVERT(char(4), YEAR(GETDATE() - 1)) + CONVERT(char(2), MONTH(GETDATE() - 1))
SELECT @SQL_ACC = '' + QuoteName(@TABLENAME) + '.dbo.EvAcc ON EvAcc.fpointeur = cards.fpointeur'
SELECT @SQL_UClass = 'dbacces1.dbo.UClass ON UClass.fpointeur = cards.fpointeur AND MClass = 1'
SELECT @SQL_UClassDef = 'dbacces1.dbo.UClassDef ON UClassDef.SClass = UClass.SClass'

SELECT @SQL = 'SELECT cards.FPointeur, Ref, Peri, cout, cin, edate FROM dbacces1.dbo.cards INNER JOIN ' + @SQL_ACC + ' INNER JOIN ' + @SQL_UClass

EXEC(@SQL)

それは機能しますが、これをビューに入れる必要があります。動作しません。このエラーが発生しました(フランス語で申し訳ありません):

La construction ou l'instruction SQL Déclarer un curseur n'est pas prise en charge.

ビューで宣言することは許可されていません。

値のあるテーブル関数を作成しようとしましたがexec、関数内の文字列で関数を使用できないため、機能しません。このエラーがあります:

Invalid use of side-effecting or time-dependent operator in 'EXECUTE STRING' within a function.

プロシージャも作成しようとしましたが、クエリのテーブルとして使用できません。データベース名のみを返す関数を作成しようとしましたが、機能しません。

解決策はありますか?

編集1-解決策

毎月実行されるスクリプトを作成します。これは私のスクリプトです:

DECLARE @start_date DATETIME
DECLARE @end_date DATETIME
DECLARE @sql VARCHAR(MAX)
DECLARE @dbname VARCHAR(15)
DECLARE @year VARCHAR(4)
DECLARE @month VARCHAR(2)

--Start the SQL request
SET @sql = 'CREATE VIEW dbo.viewEvAcc AS '

SET @start_date = convert(DATETIME, '01/01/2011', 101)
SET @end_date = GETDATE()

--Loop from the start date to now
WHILE @start_date < @end_date
BEGIN
    --Find new year and month
    SET @year = CONVERT(CHAR(4), YEAR(@start_date))
    SET @month = RIGHT('0' + RTRIM(MONTH(@start_date)), 2);

    --Create the db name with year and month
    SET @dbname = 'EVENT' + @year + @month

    --Concat the SQL Request
    SET @sql = @sql + 'SELECT * FROM ' + @dbname + '.dbo.EvAcc'

    --Update the start date for the month after
    SET @start_date = CONVERT(VARCHAR(8),DATEADD(MONTH,1,CONVERT(VARCHAR(8),@start_date,112)),112)

    --If the date is not the last date, it add a union
    IF @start_date < @end_date
    BEGIN
        SET @sql = @sql + ' UNION ALL '
    END
END

-- drop and create a view with new information
USE dbacces1
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'viewEvAcc')DROP VIEW dbo.viewEvAcc; 
EXEC(@sql)
4

3 に答える 3

0

ビューには静的selectステートメントのみを含めることができるため、動的SQLを実装する場合は、これをストアドプロシージャ内に配置する必要があります。次の手順に従うことができます。

  1. 動的SQLを使用してストアドプロシージャを作成します--sp_1
  2. 他のクエリでストアドプロシージャを作成します--sp_2
  3. このストアドプロシージャ内で、sp_1を呼び出し、結果を一時テーブルに挿入します
  4. この一時テーブルをクエリに参加させます。
于 2012-12-13T21:30:20.023 に答える
0

おそらく、シノニムを使用できます:http://msdn.microsoft.com/en-us/library/ms187552(v=sql.100) .aspx

シノニムオブジェクトからデータを選択する静的ビューを作成しますが、ビューから選択する前に、必要なデータベースからテーブルにシノニムを再割り当てします。

于 2012-12-13T21:46:39.530 に答える
0

ビューが定期的に(つまり毎日)変更される場合は、必要に応じてビューを削除して再作成(変更)するジョブをスクリプト化できます。それは、その新しいテーブルを作成および/または設定するジョブの一部である可能性があります。

空のテーブルが事前に作成されている場合は、それらすべてを結合するためのパーティションビューの作成を検討してください。次に、その上に結合を使用してクエリを配置し、そのクエリのwhere句に日付制約を追加できます。

パーティションビュー

于 2012-12-13T23:04:21.110 に答える