sql-server - SQL 查询在 SQL Server Management Studio 中运行良好,但是当我从 VBA 运行它时,它返回空白
问题描述
这是代码。有什么东西不能从 Excel 运行吗?我已经通过将文本输出到单元格并复制到 SQL Server Management Studio 并运行来测试 Excel 中的 SQL 代码,它工作正常。
提前致谢
Declare @GroupNumber as varchar(5)
Declare @GroupName as varchar(max)
Declare @ValuationDate as Date
Declare @GroupStartDate as Date
Declare @GroupAnniversayDate as Date
Declare @ValuationYRMO as varchar(6)
Declare @PlanCode as varchar(6)
--**************************Change Here*********
Set @GroupNumber = '01142'
Set @ValuationDate = '08-31-2019'
--**************************************************
Set @ValuationYRMO = convert(varchar(6),year(@ValuationDate)*100 + month(@ValuationDate))
--****************** Delete Temp Tables
IF OBJECT_ID('tempdb..#Census') IS NOT NULL
drop table #Census
IF OBJECT_ID('tempdb..#RateTablePrepStep1') IS NOT NULL
drop table #RateTablePrepStep1
IF OBJECT_ID('tempdb..#RateTablePrepStep2') IS NOT NULL
drop table #RateTablePrepStep2
IF OBJECT_ID('tempdb..#RateTable') IS NOT NULL
drop table #RateTable
IF OBJECT_ID('tempdb..##MembershipData') IS NOT NULL
drop table ##MembershipData
IF OBJECT_ID('tempdb..#Membership') IS NOT NULL
drop table #Membership
IF OBJECT_ID('tempdb..##ClaimData') IS NOT NULL
drop table ##ClaimData
IF OBJECT_ID('tempdb..#Claims') IS NOT NULL
drop table #Claims
IF OBJECT_ID('tempdb..##Completion') IS NOT NULL
drop table ##Completion
IF OBJECT_ID('tempdb..#ValuationDates') IS NOT NULL
drop table #ValuationDates
IF OBJECT_ID('tempdb..#PaymentStatus') IS NOT NULL
drop table #PaymentStatus
IF OBJECT_ID('tempdb..#InvoiceData') IS NOT NULL
drop table #InvoiceData
IF OBJECT_ID('tempdb..#AgentGroup') IS NOT NULL
drop table #AgentGroup
IF OBJECT_ID('tempdb..#GroupEarnedPremium') IS NOT NULL
drop table #GroupEarnedPremium
IF OBJECT_ID('tempdb..#EarnedPremium') IS NOT NULL
drop table #EarnedPremium
IF OBJECT_ID('tempdb..#PaymentFrequency') IS NOT NULL
drop table #PaymentFrequency
IF OBJECT_ID('tempdb..#InvoiceWOTax') IS NOT NULL
drop table #InvoiceWOTax
--****************** Start Date and Anniversary Date
Set @GroupStartDate = (Select top 1 a.FirstEffectiveDate
From [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b on a.PolicyGroupId=b.PolicyGroupId
where b.GroupNumber=@GroupNumber)
Set @GroupAnniversayDate = (Select top 1 a.RenewalDate
From [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b on a.PolicyGroupId=b.PolicyGroupId
where b.GroupNumber=@GroupNumber)
--****************** Census
SELECT distinct b.GroupNumber,
Case when b.[Description] is null then pl.[name] else b.[description] end as [Group Name],
ps.[name] as [Group Status],
cc.[name] as [Group Country],
b1.GroupNumber as Subsidiary,
a2.PolicyId as [Certificate],
ps2.[name] as [Certificate Status],
me.MemberId,
con.FirstName as [First Name],
con.LastName as [Last Name],
mt.[name] as [Member Type],
ms.[Name] as [Member Status],
con.DateOfBirth as [Date of Birth],
Case when @ValuationDate > = dateadd(year,year(@ValuationDate)-year(con.DateOfBirth),con.DateOfBirth)
then year(@ValuationDate)-year(con.DateOfBirth)
else year(@ValuationDate)-year(con.DateOfBirth) -1 end as Age,
ge.[name] as Gender,
pl.[Code],
pl.[Name] as [Plan Name],
po.[name] as [Plan Option]
into #Census
FROM [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a
left join [Actuarial].CurrentMonth.[PolicyAdminPolicyCountry] pc on a.PolicyId=pc.PolicyId
left join [Actuarial].[CurrentMonth].[GenericCountry] cc on pc.CountryId=cc.CountryId and pc.EndDate is null
left join [Actuarial].[CurrentMonth].[GenericStatus] ps on a.StatusId=ps.StatusId
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b on a.PolicyGroupId=b.PolicyGroupId
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a1 on a.policyid=a1.ParentPolicyId
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b1 on a1.PolicyGroupId=b1.PolicyGroupId
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a2 on a1.policyid=a2.ParentPolicyId
left join [Actuarial].[CurrentMonth].[GenericStatus] ps2 on a2.StatusId=ps2.StatusId
left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyEligibility] pe on a2.policyid=pe.PolicyId
left join [Actuarial].[CurrentMonth].[ProductConfigPlan] pl on pe.PlanId=pl.PlanId
left join [Actuarial].[CurrentMonth].[PolicyAdminMemberEligibility] me on pe.PolicyEligibilityId=me.PolicyEligibilityId
left join [Actuarial].[CurrentMonth].[GenericStatus] ms on me.StatusId=ms.StatusId
left join [Actuarial].[CurrentMonth].[ProductConfigPlanOption] po on me.PlanOptionId=po.PlanOptionId
left join [Actuarial].[CurrentMonth].[ProductConfigMemberType] mt on me.MemberTypeId=mt.MemberTypeId
left join [Actuarial].[CurrentMonth].[PolicyAdminMember] mem on me.MemberId=mem.MemberId
left join [Actuarial].[CurrentMonth].[ContactMgmtContact] con on mem.ContactId=con.ContactId
left join [Actuarial].[CurrentMonth].[GenericGender] ge on con.GenderId=ge.GenderId
where b.GroupNumber=@GroupNumber and pe.EndDate is null and me.EndDate is null
order by b.groupnumber,b1.GroupNumber,a2.PolicyId
select * from #census order by [GroupNumber],Subsidiary,[Plan Option],[Certificate]
我被困在如何进行。我已经用一个简单的前 10 名查询测试了我的记录连接,并且在 VBA 中运行良好。
这是我的 VBA 代码:
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim rst2 As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQueryBase As String
Dim StrQueryBase2 As String
Dim StrQueryBase3 As String
Dim StrQueryGroupDate As String
Dim StrQueryCensus As String
Dim StrQueryCensus2 As String
Dim StrQueryCensus3 As String
Dim StrQueryTest As String
ConnectionString = "Provider=SQLOLEDB; Data Source=bddc1didw1;Initial Catalog=Actuarial; Trusted_connection=Yes; Integrated Security='SSPI'"
'Opens connection to the database
cnn.Open ConnectionString
'Timeout error in seconds for executing the entire query; this will run for 15 minutes before VBA timesout, but your database might timeout before this value
cnn.CommandTimeout = 1500
StrQueryBase = "Declare @GroupNumber as varchar(5) " & _
"Declare @GroupName as varchar(max) " & _
"Declare @ValuationDate as Date " & _
"Declare @GroupStartDate as Date " & _
"Declare @GroupAnniversayDate as Date " & _
"Declare @ValuationYRMO as varchar(6) " & _
"Declare @PlanCode as varchar(6) " & _
"Set @GroupNumber = '01142' " & _
"Set @ValuationDate = '08-31-2019' " & _
"Set @ValuationYRMO = convert(varchar(6),year(@ValuationDate)*100 + month(@ValuationDate)) " & _
"IF OBJECT_ID('tempdb..#Census') IS NOT NULL " & _
"drop table #Census " & _
"IF OBJECT_ID('tempdb..#RateTablePrepStep1') IS NOT NULL " & _
"drop table #RateTablePrepStep1 " & _
"IF OBJECT_ID('tempdb..#RateTablePrepStep2') IS NOT NULL " & _
"drop table #RateTablePrepStep2 " & _
"IF OBJECT_ID('tempdb..#RateTable') IS NOT NULL " & _
"drop table #RateTable " & _
"IF OBJECT_ID('tempdb..##MembershipData') IS NOT NULL " & _
"drop table ##MembershipData " & _
"IF OBJECT_ID('tempdb..#Membership') IS NOT NULL " & _
"drop table #Membership "
StrQueryBase2 = "IF OBJECT_ID('tempdb..##ClaimData') IS NOT NULL " & _
"drop table ##ClaimData " & _
"IF OBJECT_ID('tempdb..#Claims') IS NOT NULL " & _
"drop table #Claims " & _
"IF OBJECT_ID('tempdb..##Completion') IS NOT NULL " & _
"drop table ##Completion " & _
"IF OBJECT_ID('tempdb..#ValuationDates') IS NOT NULL " & _
"drop table #ValuationDates " & _
"IF OBJECT_ID('tempdb..#PaymentStatus') IS NOT NULL " & _
"drop table #PaymentStatus " & _
"IF OBJECT_ID('tempdb..#InvoiceData') IS NOT NULL " & _
"drop table #InvoiceData " & _
"IF OBJECT_ID('tempdb..#AgentGroup') IS NOT NULL " & _
"drop table #AgentGroup " & _
"IF OBJECT_ID('tempdb..#GroupEarnedPremium') IS NOT NULL " & _
"drop table #GroupEarnedPremium " & _
"IF OBJECT_ID('tempdb..#EarnedPremium') IS NOT NULL " & _
"drop table #EarnedPremium " & _
"IF OBJECT_ID('tempdb..#PaymentFrequency') IS NOT NULL " & _
"drop table #PaymentFrequency " & _
"IF OBJECT_ID('tempdb..#InvoiceWOTax') IS NOT NULL " & _
"drop table #InvoiceWOTax " & _
"Set @GroupStartDate = (Select top 1 a.FirstEffectiveDate " & _
"From [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b on a.PolicyGroupId=b.PolicyGroupId "
StrQueryBase3 = "where b.GroupNumber=@GroupNumber) " & _
"Set @GroupAnniversayDate = (Select top 1 a.RenewalDate " & _
"From [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b on a.PolicyGroupId=b.PolicyGroupId " & _
"where b.GroupNumber=@GroupNumber) "
StrQueryCensus = "SELECT distinct b.GroupNumber, " & _
"Case when b.[Description] is null then pl.[name] else b.[description] end as [Group Name], " & _
"ps.[name] as [Group Status], " & _
"cc.[name] as [Group Country], " & _
"b1.GroupNumber as Subsidiary, " & _
"a2.PolicyId as [Certificate], " & _
"ps2.[name] as [Certificate Status], " & _
"me.MemberId, " & _
"con.FirstName as [First Name], " & _
"con.LastName as [Last Name], " & _
"mt.[name] as [Member Type], " & _
"ms.[Name] as [Member Status], " & _
"con.DateOfBirth as [Date of Birth], " & _
"Case when @ValuationDate > = dateadd(year,year(@ValuationDate)-year(con.DateOfBirth),con.DateOfBirth) " & _
"then year(@ValuationDate)-year(con.DateOfBirth) " & _
"else year(@ValuationDate)-year(con.DateOfBirth) -1 end as Age, " & _
"ge.[name] as Gender, " & _
"pl.[Code], " & _
"pl.[Name] as [Plan Name], " & _
"po.[name] as [Plan Option] " & _
"into #Census " & _
"FROM [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a " & _
"left join [Actuarial].CurrentMonth.[PolicyAdminPolicyCountry] pc on a.PolicyId=pc.PolicyId " & _
"left join [Actuarial].[CurrentMonth].[GenericCountry] cc on pc.CountryId=cc.CountryId and pc.EndDate is null "
StrQueryCensus2 = "left join [Actuarial].[CurrentMonth].[GenericStatus] ps on a.StatusId=ps.StatusId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b on a.PolicyGroupId=b.PolicyGroupId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a1 on a.policyid=a1.ParentPolicyId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyGroup] b1 on a1.PolicyGroupId=b1.PolicyGroupId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicy] a2 on a1.policyid=a2.ParentPolicyId " & _
"left join [Actuarial].[CurrentMonth].[GenericStatus] ps2 on a2.StatusId=ps2.StatusId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminPolicyEligibility] pe on a2.policyid=pe.PolicyId " & _
"left join [Actuarial].[CurrentMonth].[ProductConfigPlan] pl on pe.PlanId=pl.PlanId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminMemberEligibility] me on pe.PolicyEligibilityId=me.PolicyEligibilityId " & _
"left join [Actuarial].[CurrentMonth].[GenericStatus] ms on me.StatusId=ms.StatusId " & _
"left join [Actuarial].[CurrentMonth].[ProductConfigPlanOption] po on me.PlanOptionId=po.PlanOptionId " & _
"left join [Actuarial].[CurrentMonth].[ProductConfigMemberType] mt on me.MemberTypeId=mt.MemberTypeId " & _
"left join [Actuarial].[CurrentMonth].[PolicyAdminMember] mem on me.MemberId=mem.MemberId " & _
"left join [Actuarial].[CurrentMonth].[ContactMgmtContact] con on mem.ContactId=con.ContactId " & _
"left join [Actuarial].[CurrentMonth].[GenericGender] ge on con.GenderId=ge.GenderId " & _
"where b.GroupNumber=@GroupNumber and pe.EndDate is null and me.EndDate is null " & _
"order by b.groupnumber,b1.GroupNumber,a2.PolicyId " & _
"select * from #census order by [GroupNumber],Subsidiary,[Plan Option],[Certificate] "
StrQueryCensus3 = StrQueryBase & StrQueryBase2 & StrQueryBase3 & StrQueryCensus & StrQueryCensus2 "
'
ActiveSheet.Range("e1") = StrQueryCensus3
rst2.Open StrQueryCensus3, cnn
ActiveSheet.Range("e2").CopyFromRecordset rst2
解决方案
推荐阅读
- r - R错误:新列会在现有列之后留下孔;如何解决这个问题?
- python - 如何在 for 循环中从 PRAW 访问帖子
- python - 如何传递来自不同 tkinter 小部件的多个参数?
- c - for 循环内的整数在每行增加 2,语句与它没有任何关系
- mysql - Mysql语法错误,问题是触发器后的END
- javascript - 如何在 map() 中声明此变量的类型
- operating-system - 什么是公平的读写锁?
- python - 从我当前的 python 文件中的另一个 python 文件中获取一些函数的副本。[不仅仅是从另一个源文件调用函数]
- css - 我可以在 react.js 组件中定义和使用 CSS at-rule 吗?
- r - R:使用不同矩阵的元素作为函数输入将函数应用于矩阵的每个元素