2011-05-10 30 views
2

こんにちは、私は基本的にSQL Server 2008の新しいビューウィンドウ内でこれをやろうとしている:動的SQL(SQL Serverなど)

宣言@var =(データベースからDBを選択します)。 exec( '名前を' +​​ @ var '+ .dbo.Namesから選択します。

このビューは実際にSQL Serverで実行されますが、保存できません(エラーが表示されます)。関数を返すテーブルを作成して、この同じものをすべて実行してテーブルを返し、ビューを作成します基本的にはそのテーブルのすべてを取りますが、これを行うことで発生する可能性のあるパフォーマンスのヒットは不明です。どんな提案も大歓迎です!ありがとう。

ソリューション: 私は、古いビューを削除し、ストアドプロシージャで新しいビュー(動的SQLを使用)を再作成することになりました。その値が変更されたら、SPを呼び出してビューを更新して、正しいデータベースを指すようにします。すべての助けを借りてくれてありがとう、何もできないことが分かっているので、私はそれらの方法を試してもらえませんでした。

+0

経由ではこれは、ビューの内側で有効なものではなく、私の知る限り、あなたは使用できません。 UDFでの動的SQLのいずれかです。 –

+0

Bah!これらの結果を得る方法はありますか?私はちょうど私のビューとしてSQL Server 2008で正確に実行できることが奇妙であることを発見し、それはうまく走ったが、それは私を保存させませんでした。 –

+0

SSMSのビューデザイナーは標準のグラフィカルなクエリーデザイナーなので、あらゆる種類の任意のSQLを入力して実行することができますが、そのビューが有効であるとは限りません! –

答えて

1

ビューのパラメータを受け入れることはできません。テーブル値関数は解です。しかし、あなたは少なくとも相手側に出てくるテーブルと結果セットを知る必要があります。あなたが結果として得られるデータセットの構造をどのように知っていますか?

+0

しかし、それはパラメータではなく、使用するデータベースの名前です。これは、オブジェクトを定義する他の方法がないので、私がexec(@string)として実行する必要があることから、このことがわかります。 –

+0

UDFは機能しません。関数内で 'EXECUTE STRING'の副作用または時間依存演算子の無効な使用をエラー –

+0

ええと試してみましたが、新しく作成したビューを再作成するストアドプロシージャを作成できるかどうかは疑問ですデータのセット? –

0

CTEを使用して、ビュー内の内部変数を簡単に偽装することができます。使用しているバージョンのSQL Serverでテスト実行できます。

CREATE VIEW vwImportant_Users AS 
WITH params AS (
    SELECT 
    varType='%Admin%', 
    varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers, params 
    WHERE status > varMinStatus OR name LIKE varType 

SELECT * FROM vwImportant_Users 

得出力:またJOIN

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers INNER JOIN params ON 1=1 
    WHERE status > varMinStatus OR name LIKE varType 

を経由しても

status name 
12  dbo 
0  db_accessadmin 
0  db_securityadmin 
0  db_ddladmin 

CROSS APPLY

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params 
    WHERE status > varMinStatus OR name LIKE varType