1

ExcelレポートをSQLAnywhereデータベースからSQLServer2008R2 Expressデータベースへのデータへのアクセスから変換していますが、実行するとエラーが発生し続けます。ユーザーは、売上高の動きを比較したいいくつかの項目を入力し、ボタンを押してマクロを実行します。マクロはアイテムを取得し、SQLクエリ文字列を作成し、結果を取得して表示します。

これは古いDBで完全に機能しました。SQL Serverで、マクロを実行すると、役に立たない「400」エラーが発生します。コードをステップスルーすると、「With ActiveSheets.QueryTables.Add(...)」セグメントの最後で、その時点で「ランタイムエラー「1004」」がスローされます。SQLServerまたはOLEDB接続でサポートされていない構文について何かがあると思いますが、それが何であるかを確認できれば気になります。

生成されたSQLクエリのDebug.Printを実行しましたが、SQLServerStudioのクエリウィンドウにコピーして貼り付けると完全に実行されます。「select*from DEPT_TAB」のような単純なものにクエリを置き換えると、マクロで正常に実行されます。テーブルの作成も正常に実行されますが、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;

どんな助けでもありがたいです、ありがとう。

4

1 に答える 1

0

アプリでクエリを実行中にトレースを実行してみましたか? すべてのエラーと例外を表示するトレースを実行します。これにより、正確な障害点が示されるはずです。多数のトランザクションが進行中の場合は、いくつかのフィルターを適用する必要があります。http://www.bbdevnetwork.com/blogs/debugging-t-sql-and-sql-profiler/が役立つかもしれませんが、エラーをオンにしてください。

テーブルには適切な権限がありますか? SSMS ウィンドウに貼り付ける場合は、そのウィンドウで dbo または sa として実行している可能性があります。これにより、Excel のユーザーのアクセス許可が制限されている場合でも実行できます。

このようなクエリを実行すると、いくつかの障害点が発生する可能性があり、多くのドライバーは有用なエラー情報を提供しないため、実際にはそのクエリをストアド プロシージャにして実行する必要があります。

于 2012-08-28T17:04:31.413 に答える