如何解决子查询-关键字'declare'附近的语法不正确
调试此问题时,希望有人可以帮助我解决此问题。这是更长的查询的一部分,但是子查询“ B”是导致问题的唯一部分,不确定为什么……我显然缺少了一些东西。我正在使用sql-server。
子查询本身可以很好地运行,只是不能与其余查询一起使用。
DECLARE @dstrt AS DATETIME
SET @dstrt = '2020-09-01 00:00:00'
DECLARE @dend AS DATETIME
SET @dend = '2020-09-30 23:59:59'
DECLARE @UnpaidChgsTot table
(
SiteID INT,Period nvarchar(30),dcDlqntTot money,iDelUnits int,dcPctUnits money,dcPctGrossPot money,dcPctActOcc money,iDatePeriod int
)
DECLARE @sLanguageTermColName nvarchar(20)
SET @sLanguageTermColName = 'English'
-- DECLARE some period counters
DECLARE @StartDayNumber int
DECLARE @EndDayNumber int
SET @StartDayNumber = 0
SET @EndDayNumber = -1
--Hold the original date value
DECLARE @dEndORig datetime
SET @dEndORig = @dEnd
DECLARE @dcGrossPotDenom money
DECLARE @dcActOccDenom money
DECLARE @iTotUnitsDenom int
SET @dcGrossPotDenom = 1
SET @dcActOccDenom = 1
SET @iTotUnitsDenom = 1
--Define a holding table for charge balances by ChargeID
DECLARE @BalT table
(
SiteID int,ChargeID int,LedgerID int,ChargeDescID int,sChgCategory nvarchar(20),sDefAcctCode nvarchar(20),dChgStrt datetime,dcBalAmt money,dcBalTax1 money,dcBalTax2 money
)
/*
* Updated. Delete was taking too long to run,added to WHERE to get rid
* Date: 10192009
* Josh
*/
--Fill the @BalT with charge balances for charges <=dEND
INSERT INTO @BalT
SELECT
B.SiteID,B.ChargeID,B.LedgerID,B.ChargeDescID,CD.sChgCategory,CA.sDefAcctCode,B.dChgStrt,dcAmt,dcTax1,dcTax2
FROM -- PROBLEM STARTS HERE
(
DECLARE @ChargesT2 table
(
SiteID int,sChgCategory nvarchar(50),sDefAcctCode nvarchar(5),dcAmt money,dcTax1 money,dcTax2 money,sChargeTag nvarchar(20)
)
DECLARE @fnPmtSumByChargeT Table
(
SiteID INT,dcPmtSum money
)
DECLARE @fnPmtSumByChargeT2 Table
(
SiteID INT,dcPmtSum money
)
DECLARE @ChargesTempT table
(
SiteID INT,dcTax2 money
)
Declare @ChargesT table
(
SiteID INT,sChargeTag nvarchar(20)
)
INSERT INTO @ChargesT2
SELECT
C.SiteID,C.ChargeID,C.ChargeDescID,sChgCategory,sDefAcctCode,C.dChgStrt,C.LedgerID,Coalesce(C.dcAmt,0.0) AS dcBalAmt,Coalesce(C.dcTax1,0.0) AS dcBalTax1,Coalesce(C.dcTax2,0.0) AS dcBalTax2,CASE
WHEN CAST(CA.sDefAcctCode AS INT) = 4000 THEN N'Rent'
WHEN CAST(CA.sDefAcctCode AS INT) = 4042 THEN N'LateFee'
WHEN CAST(CA.sDefAcctCode AS INT) = 4041 THEN N'AdminFee'
WHEN CAST(CA.sDefAcctCode AS INT) = 4070 THEN N'Insurance'
WHEN CAST(CA.sDefAcctCode AS INT) BETWEEN 4060 AND 4068 OR CAST(CA.sDefAcctCode AS INT) BETWEEN 4071 AND 4079 THEN N'POS'
--WHEN CAST(CA.sDefAcctCode AS INT) = 2020 THEN 'SecDep'
ELSE N'Others'
END as sChargeTag
FROM Charges AS C
INNER JOIN ChargeDesc AS CD ON C.ChargeDescID = CD.ChargeDescID
LEFT OUTER JOIN ChartOfAccts AS CA ON CD.ChartofAcctID = CA.ChartOfAcctID
WHERE
C.dDeleted IS NULL
AND C.dChgStrt <= @dend
--2016-01-12 - Case # 237424 - C158,L005,Unit 10478,Tenant - Zach Reese.
--Commented out dCreated evaluation. This is because A/R does not prevent backdating charges from changing historical reports. There is no way these two reports
--can tie out in the same period if we do not allow backdating charges that we created in a future period. Ex. Late fee created on January 2,2016,but dChgStrt of 12/29/2015.
--AND dCreated <= @dEnd --This is to catch a case where NSF charges were added (backdated) after the report end date,affecting historical reporting. 02102011 Josh
AND (bNSF = 0 OR (bNSF = 1 AND dCreated <= @dend))--updated the logic to be different for NSF charges to not change reports historically; this loigc is consistant with A/R. Case # 269909
GROUP BY C.siteID,C.dcAmt,C.dcTax1,C.dcTax2,CA.sDefAcctCode
INSERT INTO @fnPmtSumByChargeT2
SELECT
SiteID,ChargeID,dcPmtSum
FROM
(
SELECT
pay.SiteID,Pay.ChargeID,SUM(pay.dcPmtAmt) AS dcPmtSum
FROM
(
SELECT
SiteID,dcPmtAmt
FROM Payments
WHERE
(dDeleted Is Null)
--AND (bNSF = 0) --this fn must return ALL payments to calculate balances correctly
AND (dPmt <= @dend)
) AS Pay
GROUP BY SiteID,ChargeID
) AS P
INSERT INTO @fnPmtSumByChargeT2
SELECT
C.SiteID,0
FROM @ChargesT2 C
INSERT INTO @fnPmtSumByChargeT
SELECT
P.SiteID,P.ChargeID,SUM(P.dcPmtSum)
FROM @fnPmtSumByChargeT2 P
GROUP BY P.SiteID,P.ChargeID
INSERT INTO @ChargesTempT
SELECT
P.SiteID,C.dcAmt - Coalesce(dbo.fnPartNonTax(C.dcAmt,P.dcPmtSum,2),0.0),C.dcTax1 - Coalesce(dbo.fnPartTax1(C.dcAmt,2,C.dcTax2 - Coalesce(dbo.fnPartTax2(C.dcAmt,0.0)
FROM @ChargesT2 C
INNER JOIN @fnPmtSumByChargeT P ON C.ChargeID = P.ChargeID
GROUP BY P.SiteId,dcTax2,dcPmtSum
HAVING (dcAmt + dcTax1 + dcTax2 - dcPmtSum) > 0 -- Removed 0 sum columns: This was a major bottleneck for this function 10202009 J
INSERT INTO @ChargesT
SELECT
C.SiteID,C.sChgCategory,C.sDefAcctCode,CT.dcAmt,CT.dcTax1,CT.dcTax2,C.sChargeTag
FROM @ChargesT2 C
INNER JOIN @ChargesTempT CT ON C.ChargeID = CT.ChargeID
SELECT *
FROM @ChargesT
AS ChargeT
) AS B -- PROBLEM ENDS HERE
INNER JOIN ChargeDesc AS CD ON B.ChargeDescID = CD.ChargeDescID AND B.Siteid = CD.SiteID
如果有帮助,我在注释中指出“问题从这里开始”和“问题从这里结束”。
谢谢。
解决方法
在子查询中,唯一要做的就是编写一条select语句。您无法编写任何想要的东西,就像它是一个代码块一样。
在您的情况下,您可以通过将所有这些表变量移到括号外并填充它们,然后在括号内进行选择来完成所需的操作。就像我说的那样,它不是代码块,没有局部变量。没有更漂亮的方法。 SQL是一种用于查询信息的简单语言。就是这样。
或者,您可能希望使用公用表表达式(CTE s)为每个子查询命名。子查询不以任何临时变量或表的形式存在,就像主查询期间可用的助手名称一样。这样可以解决您想要做的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。