2009-07-02 4 views
0

SQL Serverにフォームデータを保存する必要がある状況がありますが、セットアップするたびに新しいフィールド名と長さが異なるフィールドが設定されます。例Sql Server 2005でxmlデータの動的ビューを作成できますか?

Job 1: 
    Field 1: first_name - varchar(20) 
    Field 2: last_name - varchar(30) 

Job 2: 
    Field 1: first_name - varchar(15) 
    Field 2: middle_initial - varchar(1) 
    Field 3: last_name - varchar(30) 

最初は、問題のフォームに正確に適合するこのデータを格納するための別個のテーブルを設定していました。しかし、このデータの動的な性質に対応するために、毎回変更されるテーブル、procs、dts、ssisパッケージが非常に多く存在するので、メンテナンスの悪夢につながります。

私たちは、このような問題のほとんどを解決するXMLフィールド内のすべてのデータを保存するためにさまざまな解決策を考え出しました。これは現在これに似ています。

<Record> 
    <first_name>value</first_name> 
    <last_name>value</last_name> 
</Record> 

その後、我々は今、これが我々の前に持っていたよりもはるかに優れているが、それはまた、我々はまだ、各カスタムビューを作成する必要があることを意味し、テーブルの外に

SELECT 
, IsNull(data.value('(/Record/first_name)[1]', 'varchar(20)'),'') as first_name 
, IsNull(data.value('(/Record/last_name)[1]', 'varchar(30)'),'') as last_name 
FROM FormTable 

を、このデータを取得するビューを作成します時間。私はむしろフィールドをリストし、私のためにそのクエリを構築するいくつかのタイプのテーブルを維持したいと思う。

Field Name | Field Type | Field Length 
first_name | varchar | 20 
last_name | varchar | 30 

私はダイナミックビューを作成できないと確信しています。 1つのオプションはテーブル値関数です。しかし、私はここで見落としているものがありますか?この方法でデータを動的に格納できるようにするためのより良いオプションがありますか(CouchDBのような他のデータベースがこれをネイティブで行うことを知っているので、SQL Serverから離れることなく)。

答えて

0

テーブル値関数動的SQLまたは一時テーブル(これはほとんどの場合、これを行うために使用する必要があります)を使用することができないため動作しません。それはあなたがする必要があるすべてを行うことができますが、問題は、ストアドプロシージャから選択することができないのは勿論である -

ストアドプロシージャは当然の選択だろう。

私はこのようなことを行うためのオプションの束を論じthis pageを見ていました。彼が言及したオプションの一つは、それは非常に簡単だろうように思えるOPENQUERYを使用していますが、パフォーマンスの問題があるかもしれない:

SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC sp_getformdata') 

とにかく、あなたはいくつかの追加のアイデアを得るためにそのリンクをチェックアウトする場合があります。

+0

「ストアドプロシージャからSELECTできません」とはどういう意味ですか?なぜSPが結果セットを返さないのはなぜですか? –

+0

さて、あなたは "SELECT first_name、last_name FROM sp_getformdata"を実行することができません - このプロセスの次の部分は分割データを取り、例のためにいくつかの方法でフォーマットするので、 "SELECT first_name +"、 "+ last_name FROM sp_getformdata" –

+0

情報ありがとう、私は前にそのリンクを読んでいます。これらのオプションのそれぞれにはある種のペナルティがあるようですが、何十万というレコードで作業しているときはパフォーマンスが低下します。 –

関連する問題