2016-04-19 28 views
2

Microsoft Accessをバックエンドとして使用し、SQL Serverをバックエンドとして使用してアプリケーションを構築しています。T-SQLの1つのパラメータを使用して複数の値を複数の行に挿入する

私は顧客情報を挿入するストアドプロシージャを持っています。顧客ごとに挿入される情報の1つは、クレジットカード番号です。各顧客のクレジットカードの数は、1〜50のいずれかになります。

私はVBAでダイナミックアレイを使用してクレジットカード番号を追加する予定です。私が抱えている問題は、ストアドプロシージャに値を渡す方法がわかりません。

私の最初の考えは、(CC番号1、CC番号2、CC番号3など)多くのパラメータを作成することでしたが、明らかにこれを行う正しい方法ではありません。

ダイナミックアレイにクレジットカード番号が追加されたら、ReDimを使用して、挿入する必要があるクレジットカード番号の数を取得できます。

渡す最も良い方法は、14個のクレジットカードの値を1つのパラメータにして、各値を新しい行として挿入することです。

+2

テーブル値のパラメータ? https://msdn.microsoft.com/en-us/library/bb510489.aspx – Kritner

+0

@Kritner:しかし、これをAccessからどのように呼び出すのでしょうか? - ストアドプロシージャが必須の場合、私はそれらを一緒に結合し、区切られた1つの文字列として渡します。次に、[スプリット機能](http://stackoverflow.com/questions/697519/split-function-equivalent-in-t-sql)を使用して抽出します。しかし、実際にはAccessから直接行を挿入する方がよいでしょう。 – Andre

+0

@Andre 各分割値をSQL Serverの新しいレコードとして挿入するにはどうすればよいですか? 私はそれぞれのために '多分アクセス にこのような何かをやってを考えています.... array' '私はにもっと良い方法があると感じますが保存されprocedure' 'next' を実行中に値これを行う。 –

答えて

0

XMLを使用して、すべての顧客情報を1つのドキュメントに渡します。このようにして、任意の数のパラメーターを渡して、サーバー上で表として照会することができます。

1

残念ながら、AFAIK、VBAはテーブル値のパラメータをサポートしていません(ADO.NETはサポートしていますが、Accessで使用するバニラVB6の実装はサポートしていません)。

レコードセットなどをループすることで、関数呼び出しのストリームをサーバーに送ることができますが、それは非常に遅くなるでしょう。あなた自身を繰り返すのを気にしない場合は、EXECステートメントが1つずつ順番にチェーンされた大きなコマンドを送信できます(DAOを使用している場合は、クエリの最初にSET NOCOUNT ONを指定してください)。

あなたは純粋なSQLソリューションを探しているなら、ここで私はこれらの種類の問題のために取る戦略です:

  • を連結は、セパレータのいくつかの並べ替え(例:」との文字列に値の配列、 "または" | ")。
  • 文字列を、値のテーブルに変換する関数またはクエリに渡します。
  • INSERTまたはMERGE最終ターゲットテーブルへの値の表。

ここであなたがそれを行うことができる方法の例です:

SET NOCOUNT ON 

DECLARE @x XML; 
DECLARE @CreditCards AS TABLE (CreditCardNumber VARCHAR(16)); 
DECLARE @FinalTable AS TABLE (CreditCardNumber VARCHAR(16)); 
DECLARE @CreditCardList AS VARCHAR(8000); 
DECLARE @Divider AS Varchar(10); 

SET @Divider=','; 
SET @CreditCardList='123456789,1111111111111111,2222222222222222,123456789'; 

IF NOT @CreditCardList IS NULL 
    BEGIN 
    SELECT @x = CAST('<A>'+ REPLACE(@CreditCardList,@Divider,'</A><A>')+ '</A>' AS XML); 
    INSERT INTO 
     @CreditCards    
    SELECT 
     t.value('.', 'varchar(16)') AS inVal 
    FROM 
     @x.nodes('/A') AS x(t) ; 
    END 

INSERT INTO 
    @FinalTable 
SELECT 
    CreditCardNumber 
FROM 
    @CreditCards 

SELECT * FROM @FinaLTable 

XML変換を行うための最速の方法はありませんが、それは比較的簡単であるという利点を持っています。ジェフ・モデン氏は、ブログ記事Tally OH! An Improved SQL 8K “CSV Splitter” Functionで、この問題へのアプローチをいくつか紹介しています。

希望に役立ちます!

関連する問題