簡體   English   中英

Excel VBA:執行SQL語句時出現錯誤3704

[英]Excel VBA : Error 3704 When executing SQL statement

我有以下代碼來執行sql語句並從服務器獲取記錄並將其粘貼到范圍中:

Option Explicit
Const conString As String = "Provider = sqloledb;Server=dbsrv;Database=xxxx;User Id=xxxx;Password=xxxx;"
Public Function execSql(ByVal sql As String, ByVal pasteRange As Range) As Integer
On Error GoTo line

Dim rs  As ADODB.Recordset
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open conString

Set rs = New ADODB.Recordset

rs.Open sql, cn

pasteRange.CopyFromRecordset rs

rs.Close
cn.Close

execSql = 0
Exit Function
line:
execSql = 1
End Function

這是我要執行的SQL語句:

DECLARE @startDate date,@endDate date
SET @startDate = [sgdb].[GNR].sgfn_ShamsiDateToDate(1397,1,1)
SET @endDate = [sgdb].[GNR].sgfn_ShamsiDateToDate(1397,1,5)

DECLARE @tblSold as TABLE (hdrID bigint,vchNo int,vchDate date,cstmrRef int, sold money)
INSERT INTO @tblSold
SELECT H.VchHdrId,H.VchNo,H.VchDate,H.CstmrRef,SUM(I.Price) AS Sold FROM [sgdb].[SLE].[SLEFactHdr] AS H JOIN [sgdb].[SLE].[SLEFactItm] AS I
ON I.VchHdrRef = H.VchHdrId
WHERE H.VchDate BETWEEN @startDate AND @endDate AND H.[Status] = 1
GROUP BY H.VchHdrId,H.VchNo,H.VchDate,H.CstmrRef

DECLARE @tblRet as TABLE (hdrID bigint,vchNo int,vchDate date,cstmrRef int, ret money)
INSERT INTO @tblRet
SELECT  H.VchHdrId,H.VchNo,H.VchDate,H.CstmrRef,SUM(I.Price) AS Ret FROM [sgdb].[SLE].[SLERetFactHdr] H JOIN [sgdb].[SLE].[SLERetFactItm] I ON I.VchHdrRef = H.VchHdrId
WHERE H.VchDate BETWEEN @startDate AND @endDate AND H.[Status] = 1
GROUP BY H.VchHdrId,H.VchNo,H.VchDate,H.CstmrRef

DECLARE @tblTax as TABLE (hdrID bigint, taxPrice money,taxType int,sr bit)
INSERT INTO @tblTax
SELECT I.VchHdrRef,SUM(TaxPrice),T.TaxType,0 FROM [sgdb].[SLE].[SLEFactItm] I JOIN [sgdb].[SLE].[SLEFactTax] FT ON FT.VchItmRef = I.VchItmId JOIN
[sgdb].[SLE].[SLETaxes] T ON T.TaxID = FT.TaxRef JOIN @tblSold TS ON TS.hdrID = I.VchHdrRef
GROUP BY I.VchHdrRef,T.TaxType

INSERT INTO @tblTax
SELECT I.VchHdrRef,SUM(TaxPrice),T.TaxType,1 FROM [sgdb].[SLE].[SLERetFactItm] I JOIN [sgdb].[SLE].[SLEFactTax] FT ON FT.VchItmRef = I.VchItmId JOIN
[sgdb].[SLE].[SLETaxes] T ON T.TaxID = FT.TaxRef JOIN @tblSold TS ON TS.hdrID = I.VchHdrRef
GROUP BY I.VchHdrRef,T.TaxType

DECLARE @tblFinalT as Table (cstmrRef int, cstmrName nvarchar(250), sold money,ret money,s_add money,s_dis money,r_add money,r_dis money)
INSERT INTO @tblFinalT
SELECT cstmrRef,'',sold,0,0,0,0,0 FROM @tblSold
INSERT INTO @tblFinalT
SELECT cstmrRef,'',0,ret,0,0,0,0 FROM @tblRet
INSERT INTO @tblFinalT
SELECT cstmrRef,'',0,0,T.taxPrice,0,0,0 FROM @tblTax T JOIN @tblSold S ON S.hdrID = T.hdrID WHERE T.sr = 0 AND T.taxType = 0
INSERT INTO @tblFinalT
SELECT cstmrRef,'',0,0,0,T.taxPrice,0,0 FROM @tblTax T JOIN @tblSold S ON S.hdrID = T.hdrID WHERE T.sr = 0 AND T.taxType = 1
INSERT INTO @tblFinalT
SELECT cstmrRef,'',0,0,0,0,T.taxPrice,0 FROM @tblTax T JOIN @tblRet R ON R.hdrID = T.hdrID WHERE T.sr = 1 AND T.taxType = 0
INSERT INTO @tblFinalT
SELECT cstmrRef,'',0,0,0,0,0,T.taxPrice FROM @tblTax T JOIN @tblRet R ON R.hdrID = T.hdrID WHERE T.sr = 1 AND T.taxType = 1

UPDATE @tblFinalT SET cstmrName = C.CstmrName FROM [sgdb].[SLE].[vwSLECstmrCrspnd] C WHERE cstmrRef = C.CstmrCode

DECLARE @tblFinal as Table (cstmrRef int, cstmrName nvarchar(250), sold money,ret money,s_add money,s_dis money,r_add money,r_dis money, total money)

INSERT INTO @tblFinal
SELECT T.cstmrRef,T.cstmrName,SUM(T.sold),SUM(T.ret),SUM(T.s_add),SUM(T.s_dis),SUM(T.r_add),SUM(T.r_dis),0 FROM @tblFinalT T
GROUP BY T.cstmrRef,T.cstmrName

UPDATE @tblFinal SET total = sold - ret + s_add - s_dis - r_add + r_dis

SELECT * FROM @tblFinal

當我嘗試執行以上語句時,出現錯誤

'3704':應用程序定義或對象定義的錯誤。

通常,當發生這種情況時,語句肯定有問題,但是我運行了SQL Server Profiler,看起來代碼不錯。 我在SQL Server本身中運行了相同的代碼,沒有問題。 實際上,Server實際上會發回數據,但是Excel VBA收到錯誤。

我嘗試了很多代碼,結果當我嘗試在sql語句中聲明一個臨時表時,彈出此錯誤。 如果我將此語句轉換為存儲過程,那么代碼就可以了,但是我不想創建SP。

這是不好的字符串連接嗎? 還是僅僅擅長解決這個問題? 我該如何解決?

使用以下命令啟動SQL查詢

set nocount on;

SQL代碼的第一行之前,它將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM