2017-12-21 4 views
0

私は、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 
+5

あなたのコードの男は**これは読めないフォーマットしてください** – FutureCake

+0

は、私には見えます。 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

+0

ありがとう、私はいつもそれらのダニのすべてを持っていませんでした。静的。多くのファイルをインポートするので、インポートが完了した後にテーブルの名前を変更します。他のジョブはデータを処理し、テーブルの内容を最終的なホームに移動し、このプロセスによって作成されたステージングテーブルを削除します。 –

答えて

0

私が投稿していますこの答えとして、私がStackOveflowは、私は電子メールのターゲットとして@countを追加しようとしていたことを考え続けコメントとしてこれを追加しようとしたときにコメントしなければならない

あなたのコードでは:。。

@Count WHILE> 0 BEGIN

SELECT TOP 1 @FileID = FILEID、@ETLFilename = ETLFilename、@ClientName = CLIENTNAME 、@のFileType =のFileType、@ColumnCount =のColumnCount、@RowsToETL = RowsToETL FilesToImport FROM WHERE StatusID = 1 BEGIN とBatchID = @BatchID

END

あなたは@countの値を更新されていません。これは決してループしないか、永遠にループします。おそらく、次のような文(最後の直前)を追加することをお勧めします。 Set @ count = @@ rowcount;あなたが生成された文の中で不要な引用符 ` '`マークの多くを持っているかのように

ベン

関連する問題