1

すべて変数(パラメーター)に基づくストアドプロシージャを使用して、同じサーバー内の2つの異なるデータベースを使用して同じクエリを実行するにはどうすればよいですか?

これは、私が使用している方法のため、ストアドプロシージャで実行する必要があります。情報は、両方のデータベースの同じテーブル名に保存されます。結果は変数に基づいて動的である必要があります。X変数を入力した場合は、databaseAから読み取る必要がありますが、Yを入力した場合は、databaseBから読み取る必要があります。

私が今持っているのは、dboが毎回変更されるだけで機能する機能するクエリだけです。答えを探すのに多くの時間を費やしましたが、何も見つかりません。誰かが私が始めるのを手伝ってもらえますか?

4

3 に答える 3

5

パラメータを使用してwhere句をチェックインし、データを選択するデータベーステーブルを決定できます。これを試してください

--assuming both tables have same table structure
select * from database1.dbo.table where 'x' = @param1
union all
select * from database2.dbo.table where 'y' = @param1

また

if (@param1 = 'x') 
begin
  select * from database1.dbo.table 
end
else if (@param1 = 'y')
begin
  select * from database2.dbo.table
end
于 2013-03-25T19:07:46.670 に答える
1

もう1つのオプションは動的SQLです。

DECLARE @sql NVARCHAR(MAX) = N'SELECT
  col FROM [Database' 
    + CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
    WHERE ...';

EXEC sp_executesql @sql;

連結する場合は、次のように言います。

+ ' WHERE somecol <= dateadd(DAY, 1, ' + @DATE + '))';

そうすると、エラーが発生します(ただし、指摘したエラーは発生しません)。動的SQLがないため、ペーストビンコードのどこでエラーが発生しているかを判断するのは困難です。ただし、上記のパターンの代わりに、強く型付けされたパラメーターを使用する必要があります。

DECLARE @date DATE = '2013-03-11'; -- no m/d/y ugliness please

DECLARE @sql NVARCHAR(MAX) = N'SELECT
  col FROM [Database' 
    + CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
    WHERE somecol <= dateadd(DAY, 1, @date_param))';

EXEC sp_executesql @sql, N'@date_param DATE', @date;

変数名を変更したので、どのように渡されるかがわかります。

整理しようとしている新しいペーストビンを編集します。変更する必要があります。

EXEC sp_executesql @SQL, N'@date_param DATE', @DATE;

に:

EXEC sp_executesql 
  @SQL, -- unparameterized command
  N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
  @USERID,       -- param 1
  @OURORDERDATE; -- param 2

ユーザーXとYがデータベース1にあり、他のユーザーがデータベース2にあると仮定すると、より多くの毛糸を解き、より多くの歯を引っ張ることができます。

DECLARE @sql NVARCHAR(MAX) = N'USE Database' 
  + CASE WHEN @UserID IN ('X','Y') THEN '1' ELSE '2' END
  + ';';

SELECT ...all the join stuff from your pastebin...
WHERE  (TABEL2.SOLDTOCUSTID = @USERID)
    and TABEL2.OURORDERDATE >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)
    and (TABEL2.OURORDERDATE <= dateadd(day, 1, @OURORDERDATE));';

EXEC sp_executesql 
  @SQL, -- unparameterized command
  N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
  @USERID,       -- param 1
  @OURORDERDATE; -- param 2
于 2013-03-25T19:15:45.127 に答える
1

必要なのは、4つの部分からなる命名規則であり、クエリステートメントを動的に構築します。また、データベースが同じサーバー上にない場合は、リンクサーバーが必要になるか、 OpenRowsetを使用する必要があります。

仮定:データベースが同じサーバー上にある場合、ストアード・プロシージャーで、データベース名@dbnameを受け入れるためのパラメーターが必要になります。


declare @sql varchar(max)
set @sql = 'select * from '+ @dbname + '.dbo.tablename'
exec(@sql)

データベースが別のサーバーにある場合は、最初にリンクサーバーを作成してから、リンクサーバーを使用するか、openrowsetを直接使用します。また、ストアドプロシージャでは、@serverNameと@DBNameの両方が必要になります


declare @sql varchar(max)
set @sql = 'select * from ' + @ServerName + '.' + @DBName + '.dbo.tablename'
exec(@sql)

注:ここで、@ servernameは、作成時にリンクされたサーバー名です。

于 2013-03-25T19:16:49.440 に答える