私は、Excelスプレッドシートを照会しているときに挿入文を作成する動的SQLを生成するプロシージャを持っています。動的SQLでの挑戦
メッセージ画面からの印刷結果をssmsウィンドウに貼り付けて実行することができます。ストアドプロシージャ内からSQLを実行しようとすると、次のような構文エラーが発生します。
'SELECT * into TestClient FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;Database=G:\CustomerETL\Employee\PendingETL\ETLEmployeexls.xls;', [Sheet1$])'
Msg 102, Level 15, State 1, Line 15
Incorrect syntax near 'SELECT * into TestClient FROM OPENROWSET('.
以下はストアドプロシージャ全体です。私は不足しているダニがどこにあるか、動的SQLを作成SETブロック内私はちょうど把握することはできません(問題がティックである知っている。ここ
はPROCです:。USE [ETL]
GO
/****** Object: StoredProcedure [dbo].[ImportExcelSheetForCustomerEmployeeUpdate2] Script Date: 12/19/2017 4:03:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ImportExcelSheetForCustomerEmployeeUpdate2](@BatchID int)
as
--EXEC ImportExcelSheetForCustomerEmployeeUpdate 2
/* -- TRUNCATE TABLE FilesToImport
UPDATE FilesToImport
SET StatusID = 1
*/
-- Jeffery Williams
-- 12/18/2017
DECLARE @FileID int
,@ETLFilename varchar(250)
,@ClientName varchar(100)
,@FileType varchar(5)
,@ColumnCount int
,@RowsToETL int
,@StatusID int
,@Processed bit = 0
,@Count int
,@SQL nvarchar(4000)
,@Sheetname varchar(50) = '[Sheet1$]'
,@CMDSQL as varchar(4000)
,@SQLCmd NVARCHAR(MAX)
SELECT *
FROM FilesToImport
BEGIN
SELECT @Count = count(*)
FROM FilesToImport
WHERE BatchID = @BatchID
AND StatusID = 1
END
PRINT 'Count of records to process: ' + cast(@Count as varchar)
WHILE @Count > 0
BEGIN
BEGIN
SELECT TOP 1 @FileID = FileID, @ETLFilename = ETLFilename, @ClientName = ClientName
,@FileType = FileType, @ColumnCount = ColumnCount, @RowsToETL = RowsToETL
FROM FilesToImport
WHERE StatusID = 1
AND BatchID = @BatchID
END
-- Rename the file
set @CMDSQL = 'rename G:\CustomerETL\Employee\PendingETL\' + @ETLFilename + ' ETLEmployeexls.xls'
exec master..xp_cmdshell @CMDSQL
--PRINT cast(@cmdsql as varchar(4000))
-- Ciode below generates our select. Need to add an INTO clause and create a staging table for each import. Prior to this step we need to rename the file.
SET @SQL = ''''
SET @SQL = @SQL + 'SELECT * into ' + coalesce(@ClientName, 'TestClient') + ' FROM OPENROWSET('
SET @SQL = @SQL + ''''
SET @SQL = @SQL + '''' + 'Microsoft.ACE.OLEDB.12.0' + '''' --+ ', '
-- Excel 12.0;HDR=NO;Database=g:\UnZip\ImportSampleXLSX.xlsx;' + ''
SET @SQL = @SQL + '''' + ', '
SET @SQL = @SQL + '''' + '''Excel 12.0;HDR=YES;Database=G:\CustomerETL\Employee\PendingETL\ETLEmployeexls.xls;''' + '''' + ', ' + @Sheetname + ')'
SET @SQL = @SQL + ''''
PRINT cast(@SQL as varchar(8000))
EXEC sp_executesql @SQL
set @CMDSQL = 'rename G:\CustomerETL\Employee\PendingETL\ETLEmployeexls.xls ' + @ETLFilename
exec master..xp_cmdshell @CMDSQL
UPDATE FilesToImport
SET StatusID = 2
WHERE FileID = @FileID
/* -- TRUNCATE TABLE FilesToImport
UPDATE FilesToImport
SET StatusID = 1
*/
SET @Count = (@Count - 1)
CONTINUE
END
あなたのコードの男は**これは読めないフォーマットしてください** – FutureCake
は、私には見えます。 SQLコード内のリテラル内に引用符を挿入する場合は、二重引用符だけが必要です。生成されたコマンドでは、引用符で囲む以外は必要ありません。例えば生成されたコードは次のようになります: '' SELECT * from CLIENT_ONE FROM OPENROWSET( '' Microsoft.ACE.OLEDB.12.0 ''、 '' Excel; .... 'SELECT *をCLIENT_ONE FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0'、 'Excel、....' – JohnRC
ありがとう、私はいつもそれらのダニのすべてを持っていませんでした。静的。多くのファイルをインポートするので、インポートが完了した後にテーブルの名前を変更します。他のジョブはデータを処理し、テーブルの内容を最終的なホームに移動し、このプロセスによって作成されたステージングテーブルを削除します。 –