Database 对象关闭时不允许操作-是否在第一行中创建表语句?
我试图在电子表格的特定空间中写入查询结果。SQL创建临时表以供查询期间使用,然后在查询结束时删除它们。这就是我的问题的原因吗?我已经在下面发布了我的源代码。错误被抛出到第530行。有更好的方法吗Database 对象关闭时不允许操作-是否在第一行中创建表语句?,database,excel,vba,Database,Excel,Vba,我试图在电子表格的特定空间中写入查询结果。SQL创建临时表以供查询期间使用,然后在查询结束时删除它们。这就是我的问题的原因吗?我已经在下面发布了我的源代码。错误被抛出到第530行。有更好的方法吗 410 With wsSheet 420 Set rnStart = Sheets("Discharge Information").Range("Q51") 430 End With 440 strSQL = "create table #encounters ( Discharge
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
不需要删除临时表,也不会导致错误
在调用CopyFromRecordSet时,您的连接似乎已关闭,请尝试将该调用移动到With块。快速查看后,我会尝试以下方法:
RETURNS @icd9_poa TABLE (
DischargeKey int,
ICD9 nvarchar(max),
POA nvarchar(max))
AS
BEGIN
。。。然后插入SQL,记住已经定义了icd9_poa
END
不必费心删除临时表-SQL Server将在您的过程完成运行后立即删除它们
我无法完全测试它,因为我没有您的数据,但这是一种从SQL过程返回记录集的方法。嘿,Nat,这是我尝试的第一件事,但我仍然收到一个“关闭时无法执行此操作”错误。您实际返回记录集的位置是哪里?我知道什么本质上是一个存储过程,但没有返回@Recordset TABLE。。。作为开始…对不起,肖恩,但我对VBA不是很熟悉。我正在选择查询底部临时表的结果。我需要添加查询字符串之外的内容吗?您无法获取临时表-请参阅是否有一种方法可以在不在所有数据库上创建存储过程的情况下完成此操作?是的。删除临时表,将其包装在RETURNS记录集中,在其中定义表,并作为最后一条指令,从该表中选择*。不幸的是,我要到星期一才能回来工作,所以我不能给你任何代码。听着,不然我就在SSMS里工作。我正在检查函数是否存在并删除它,然后创建它并运行它。我遇到的问题是分批分离器。SQL作为strSQL变量的一部分在一行中传递给VBA脚本,但批处理分隔符需要在它们自己的行中。有办法解决这个问题吗?如果存在,请从sys.objects中选择*,其中object_id=object_id'[dbo].[ICD9andPOA]'并键入N'FN',N'IF',N'TF',N'FS',N'FT'drop function[dbo]。[ICD9andPOA]EndBatch创建函数ICD9andPOAALTER函数将允许您覆盖任何现有函数。可以使用vbCrLf插入石灰分离器。我还没有尝试过vba中的多行函数,因为我倾向于使用存储过程和参数(如果我需要传递附加信息),对吧,但需要先创建函数,对吗?我正在创建一个Excel电子表格,可以在我们的系统中的任意数据库上运行。我不想在每个数据库上创建函数。使用cnt.execute将允许您运行除GO之外的几乎所有SQL命令,因此您可以使用cnt.execute IF existed从sys.objects中选择*,其中object_id=object_IDN'[dbo].[ICD9andPOA]'并键入N'FN',N'IF',N'TF N'FS',N'FT'drop function[dbo].[ICD9andPOA]这就成功了!我使用execute执行函数存在性检查/删除,然后使用strSQL变量从函数中获取结果。非常感谢你的帮助,肖恩!