2012-04-20 15 views
4

Excel 2007で、ストアドプロシージャを使用してSQL Server 2008のテーブルにデータを書き込むユーザーフォームがあります。SQL Server 2008のVBAからテーブル変数に値を渡す方法は?

挿入された行は、私がVBAに報告したIdentityを取得します。次に、この番号を使用して、複数行のデータを別の表に取り込みます。

しかし、ストアドプロシージャを最初に実行してから別のテーブルに書き込む代わりに、ストアドプロシージャで両方の処理を実行したいと考えています。

問題は、他のテーブルのエントリが1行より大きく、VBAからSQLに送信するパラメータに1つの値しか含めることができないという問題です。

私はSQLでテーブル変数を作成する必要があると思います。しかし、VBAの値をSQLのテーブル変数に渡すにはどうすればよいですか?すべてが1つのストアドプロシージャで実行されることを忘れないでください。これは私がこれまで持っていたものです。

ありがとうございました!

--SQL Stored Procedure 
ALTER procedure [dbo].[Audit_InsertAuditFinding] 

@AuditRID as int 
,@EnteredBy as varchar(10) 
,@AuditItemNumber as int 
,@AuditFindingShort as varchar(50) 
,@AuditFindingLong as varchar(500) 
,@AuditDocsSaved as bit 
,@AuditIncident as int output 

as 
BEGIN 
SET NOCOUNT ON 
Insert Into Audit_Findings 
Values (@AuditRID,@EnteredBy,GETDATE(),@AuditItemNumber,@AuditFindingShort,@AuditFindingLong,@AuditDocsSaved) 

declare @AuditFindingNumber as int 
select @AuditFindingNumber = MAX(@@IDENTITY) 

select @AuditIncident = @AuditFindingNumber 
END 

ここまでは私のVBAコードです。

--VBA Code 
cnn.CursorLocation = adUseClient 
cmd.ActiveConnection = cnn 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = "InternalReporting.dbo.Audit_InsertAuditFinding" 
cmd.NamedParameters = True 
Set prm = cmd.CreateParameter("@AuditRID", adInteger, adParamInput, 50, Audit_Topic.Value * 1) 
cmd.Parameters.Append prm 
Set prm = cmd.CreateParameter("@EnteredBy", adVarWChar, adParamInput, 10, Environ("UserName")) 
cmd.Parameters.Append prm 
Set prm = cmd.CreateParameter("@AuditItemNumber", adInteger, adParamInput, 10, Audit_ItemNumber.Value * 1) 
cmd.Parameters.Append prm 
Set prm = cmd.CreateParameter("@AuditFindingShort", adVarWChar, adParamInput, 50, Audit_ShortDescr.Value) 
cmd.Parameters.Append prm 
Set prm = cmd.CreateParameter("@AuditFindingLong", adVarWChar, adParamInput, 500, Audit_LongDescr.Value) 
cmd.Parameters.Append prm 
Set prm = cmd.CreateParameter("@AuditDocsSaved", adVarWChar, adParamInput, 500, Doc_Saved) 
cmd.Parameters.Append prm 
Set prm = cmd.CreateParameter("@AuditIncident", adVarWChar, adParamOutput, 10, Incident_Number.Value) 
cmd.Parameters.Append prm 

cmd.Execute 

Incident_Number.Value = cmd.Parameters("@AuditIncident") * 1 
SQL_String = "Delete from InternalReporting.dbo.Audit_Findings_Notifications where Audit_Incident = " & Incident_Number.Value * 1 

rst.Open SQL_String, cnn, adOpenStatic 
    Set rst = Nothing 

    With AUD_02_Item_Mgmt.Notify_Overview 
    For I = 1 To .ListCount 
     SQL_String = "Insert Into InternalReporting.dbo.Audit_Findings_Notifications " & _ 
        "Values (" & Incident_Number.Value & ",'" & .List(I - 1, 0) & _ 
        "','" & .List(I - 1, 2) & "')" 
     rst.Open SQL_String, cnn, adOpenStatic 
     Set rst = Nothing 
    Next I 
End With` 
+0

あなたの後ろのことはわかりませんが、ADOパラメータで定義されているデータ型がストアドプロシージャのパラメータと異なることに気付きました。私は過去にこのようなことで問題を抱えていましたので、それはあなたがまだ問題を引き起こしていないかどうか知っておくべきことです。これは役立つかもしれません:http://www.w3schools.com/ado/ado_datatypes.asp – markblandford

+0

ねえ、はい、そうかもしれません。私はそれらを調和させるでしょうが、どのようにvbaからSQLのテーブル変数にいくつかの値を渡すことができます。どこから始めたらいいのか分かりません。 – Daniel

答えて

1

通常の/古典的なADOでは、テーブル変数のデータ型がないため、これは可能ではないと思います。

代わりに、XMLデータ文字列を作成し、それをストアドプロシージャで解析することもできます。

関連する問題