2

スプレッドシートの特定のスペースにクエリの結果を書き込もうとしています。SQL は、クエリ中に使用する一時テーブルを作成し、最後に削除します。これが私の問題の原因ですか?ソースコードを以下に掲載しました。エラーは行 530 でスローされます。これを行うためのより良い方法はありますか?

410   With wsSheet
420   Set rnStart = Sheets("Discharge Information").Range("Q51")
430   End With

440   strSQL = "create table #encounters ( DischargeKey int,EncounterID varchar(25))          insert into #encounters " & _
           "SELECT top 30 dischargekey,encounternumber from discharges order by dischargedate desc " & _
           "CREATE TABLE #icd9_poa(DischargeKey int,ICD9 nvarchar(max),POA nvarchar(max)) " & _
           "DECLARE @i int, @f int SET @i = 1 SET @f = ( " & _
           "SELECT REPLACE(column_name,'icd9_POA_','') FROM information_schema.Columns WHERE column_name LIKE 'icd9_POA_%' AND table_name = 'temp_discharge' AND ordinal_position IN ( " & _
           "SELECT Max (ordinal_position) FROM information_schema.Columns " & _
           "WHERE column_name LIKE 'icd9_POA_%' AND table_name = 'temp_discharge')) " & _
           "WHILE @i <= @f " & _
           "BEGIN IF @i=1 " & _
           "BEGIN INSERT INTO #icd9_poa " & _
           "SELECT d.DischargeKey,i.icd9code,poa.poa " & _
           "FROM discharges d " & _
           "inner join #encounters e on e.dischargekey = d.dischargekey INNER join icd9diagnosesbridge icb on icb.discharge=d.dischargekey INNER join icd9diagnoses i on icb.icd9 = i.icd9key INNER join presentonadmission poa on icb.presentonadmission = poa.poakey " & _
           "WHERE icb.Icd9Sequence = 1 End " & _
           "IF @I>1 BEGIN " & _
           "Update t SET t.Icd9 = t.Icd9 + ', '+i.Icd9Code,t.poa = t.poa + ', '+ poa.poa " & _
           "FROM  #Icd9_poa t" & _
           "INNER JOIN Discharges d ON (t.DischargeKey=d.DischargeKey) INNER JOIN Icd9DiagnosesBridge icb ON (icb.Discharge=d.DischargeKey) INNER JOIN Icd9Diagnoses i ON (icb.Icd9=i.icd9Key) INNER JOIN PresentOnAdmission poa ON (icb.PresentOnAdmission=poa.PoaKey) " & _
           "WHERE icb.Icd9Sequence=@i End " & _
           "SET @i = @i + 1 End " & _
           "select icd9, poa from #icd9_poa " & _
           "drop table #icd9_poa " & _
           "drop table #encounters "


450   Set cnt = New ADODB.Connection

460

470   With cnt
480   .CursorLocation = adUseClient
490   .Open ConnectionString
500   .CommandTimeout = 0
510   Set rst = .Execute(strSQL)
520   End With
530   rnStart.CopyFromRecordset rst
4

2 に答える 2

1

非常に簡単に見てみると、次の方法を試してみます。

RETURNS @icd9_poa TABLE (
    DischargeKey int,
    ICD9 nvarchar(max),
    POA nvarchar(max)) 
AS
    BEGIN

icd9_poa... 次に、SQL を挿入します (既に定義されていることを思い出してください)。

    END

一時テーブルを削除する必要はありません。プロシージャの実行が終了するとすぐに、SQL Server によって一時テーブルが削除されます。

あなたのデータがないので、完全にはテストできませんが、これは SQL プロシージャからレコードセットを返すメソッドです。

于 2012-12-03T14:38:26.630 に答える
0

一時テーブルを削除する必要はなく、エラーの原因にはなりません。

「CopyFromRecordSet」を呼び出すまでに接続が閉じているようです。その呼び出しを「With」ブロックに移動してみてください。

于 2012-11-27T02:30:35.500 に答える