Sql server 查询表上的Excel VBA错误。添加和SQL Server 2008R2 Express

Sql server 查询表上的Excel VBA错误。添加和SQL Server 2008R2 Express,sql-server,excel,oledb,vba,Sql Server,Excel,Oledb,Vba,我正在将Excel报表从访问SQLAnywhere数据库中的数据转换为SQL Server 2008R2 Express数据库,并且在运行它时不断出现错误。用户输入一些他们想要比较销售变动的项目,然后按下按钮运行宏。宏获取项目,创建SQL查询字符串,获取结果并显示它们 这在旧DB中非常有效。现在使用SQL Server,如果运行宏,则会出现一个没有帮助的错误。如果我一步一步地浏览代码,在代码的末尾,使用ActiveSheets.QueryTables.Add。。。段在该点抛出运行时错误“1004

我正在将Excel报表从访问SQLAnywhere数据库中的数据转换为SQL Server 2008R2 Express数据库,并且在运行它时不断出现错误。用户输入一些他们想要比较销售变动的项目,然后按下按钮运行宏。宏获取项目,创建SQL查询字符串,获取结果并显示它们

这在旧DB中非常有效。现在使用SQL Server,如果运行宏,则会出现一个没有帮助的错误。如果我一步一步地浏览代码,在代码的末尾,使用ActiveSheets.QueryTables.Add。。。段在该点抛出运行时错误“1004”。我猜我的语法中有些东西是SQL Server或OLE DB连接不支持的,但如果我能看到它是什么,那就糟了

我已经完成了生成的SQL查询的Debug.Print,如果我将其复制/粘贴到SQLServerStudio中的查询窗口中,它将运行得非常好。如果我将查询替换为简单的内容,例如从DEPT_选项卡中选择*,则宏可以正常运行。创建一个表也可以正常运行,但是添加INSERT语句会使它失效

以下是宏代码:

Sub SalesHistory()
' Runs SQL from sheet and places into report
' declare method variables
Dim sSQL As String
Dim sConn As String
Dim N1 As Integer
Dim LR As Integer
' create connection string for SQL Server Express
sConn = "OLEDB;Provider=SQLOLEDB;" & _
    "Data Source=192.168.0.29\SQLEXPRESS;" & _
    "Initial Catalog=STORESQL;" & _
    "User ID=xxxxx;Password=xxxxx;Trusted_Connection=False;"

' stop screen updating while running
Application.ScreenUpdating = False

' select SQL sheet and get number of rows in column A
Sheets("SQL").Select
LR = Range("A" & Rows.Count).End(xlUp).Row

' loop through column A and create SQL command string
For N1 = 1 To LR
sSQL = sSQL & " " & Range("A" & N1).Value
Next N1

' test print sSQL
Debug.Print sSQL

' select Main sheet, clear report, and activate for new results
Sheets("Main").Select
Range("$A$2:$D$51").ClearContents
Sheets("Main").Activate

' use QueryTables.Add() to get data from server
With ActiveSheet.QueryTables.Add(Connection:=sConn, Destination:=Range("A2))
    .CommandText = sSQL
    .Name = "Movement"
    .FieldNames = False
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .Refresh BackgroundQuery:=False
End With  
' HERE IS WHERE THE ERROR IS THROWN

' restart ScreenUpdating
Application.ScreenUpdating = True

End Sub
以下是工作表中的查询:

-- declare variables
DECLARE @StartDate DATE;
DECLARE @Location CHAR(3);
SET @StartDate = '07/29/2012';
SET @Location = 'PAL';
-- create temp table for holding results
CREATE TABLE #tmp_ItemMove (
UPC CHAR(13) NULL,
Brand CHAR(32) NULL,
Descriptor CHAR(32) NULL,
Sales INT NULL);
-- insert zero values for each item so that they always show up in final report
INSERT INTO #tmp_ItemMove 
SELECT OBJ.F01, OBJ.F155, OBJ.F29, 0
FROM OBJ_TAB OBJ
WHERE OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '';
-- insert sales information into temp table
INSERT INTO #tmp_ItemMove
SELECT OBJ.F01, OBJ.F155, OBJ.F29, 
CASE WHEN TRS.F67=0 THEN TRS.F64 ELSE TRS.F67 END
FROM
RPT_ITM_D TRS JOIN OBJ_TAB OBJ ON TRS.F01=OBJ.F01
JOIN TLZ_TAB TLZ ON TRS.F1034=TLZ.F1034
JOIN LNK_TAB LNK ON TRS.F1056=LNK.F1056 AND TRS.F1057=LNK.F1057 AND LNK.F1000=@Location
WHERE (OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '' OR
OBJ.F01 LIKE '') AND
TRS.F254 >= @StartDate AND
TRS.F1034 BETWEEN 3 AND 4;
-- get final report
-- sum sales history for each item and display
SELECT MAX(UPC),
MAX(Brand),
MAX(Descriptor),
SUM(Sales)
FROM #tmp_ItemMove
GROUP BY UPC, Brand, Descriptor
ORDER BY SUM(Sales) DESC, Brand, UPC;
DROP TABLE #tmp_ItemMove;

非常感谢您的帮助。

在应用程序中运行查询时,您是否尝试过运行跟踪?运行将显示所有错误和异常的跟踪。这将向您显示故障的确切点。如果有许多事务正在进行,则需要应用一些过滤器。这可能会有帮助:但请确保启用“错误”

这些表是否具有适当的权限?如果要将其粘贴到SSMS窗口中,您可能会在该窗口中以dbo或sa的身份运行,这将允许它在excel中的用户可能具有受限权限的情况下运行


您真的应该将该查询放入存储过程并执行,因为运行这样的查询可能会出现多个故障点,而且许多驱动程序不会向您提供任何有用的错误信息。

我以同一用户的身份登录到SSMS窗口,所以权限应该是相同的。我希望将其设置为存储过程,但这是一个供应商提供的数据库,除了临时表之外,我不应该做任何写操作。我将尝试运行跟踪,谢谢。嗯,在供应商服务器上禁用了调试。也许如果我可以不用临时表重新做…那是一个棘手的情况。您可以做的是获取捕获的语句,并执行每个语句,例如,尽可能将CREATE TABLE tmpcol int NULL、col2 varchar as sSQL定义为自己的批处理,并查看结果。例如,这将向您显示您的第一次插入是否失败,而执行整个操作只会产生一个无用的错误。那么,临时表也可能是问题所在,您是否有权访问tempdb?只是一个快照,但请尝试将您的提供程序从SQLOLEDB更改为SQLNCLI10.1。我认为本机SQL提供程序可以处理比OLEDB提供程序更多的语法。运气不好,但感谢您的提示: