OPENROWSETにwhere句が必要ですが、常に修正されるとは限りません。場合によってはnullになることがあります。あなたがここで見ることができるように私には手順があります:
ALTER PROCEDURE [dbo].[OpenExcel] @TableName VARCHAR(2000)
,@FileName VARCHAR(2000)
,@ExcelName VARCHAR(2000)
,@SheetName VARCHAR(100)
,@Header VARCHAR(50)
,@WhereClause VARCHAR(1000)
,@ResultOpenExcel INT OUTPUT
AS
BEGIN
DECLARE @Detail NVARCHAR(max)
,@RowFlag BIT = 0
SET @ResultOpenExcel = 0
BEGIN TRY
BEGIN TRANSACTION OpenExcel
DECLARE @Provider NVARCHAR(2000);
SET @Provider = 'Microsoft.ACE.OLEDB.12.0';
DECLARE @date DATETIME
SET @date = getdate()
DECLARE @SQL NVARCHAR(MAX) = ' SELECT * ,' + QUOTENAME(@ExcelName, '''') + ' AS ExcelName ,' + QUOTENAME(@date, '''') + ' AS TimeStamp
INTO #TTT
from openrowset(''' + @Provider + ''',''Excel 8.0;Database=' + @FileName + ';hdr=' + @Header + '' + ''',
''select * from [' + @SheetName + '$]' + @WhereClause + ' );
insert into ' + @TableName + '
select *
from #TTT
drop Table #TTT'
PRINT @SQL
EXEC (@SQL)
--------------------------------
DECLARE @RowCount INT = @@ROWCOUNT;
IF (@RowCount > 1)
SET @RowFlag = 1
SET @ResultOpenExcel = 1
COMMIT TRANSACTION OpenExcel
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION OpenExcel
SET @ResultOpenExcel = 0
SELECT @Detail = ErrorMessage
FROM dbo.GetErrorInfo()
EXECUTE [TestTest].[dbo].[Sp_Log] @TableName
,'[dbo].[OpenExcel]'
,@Detail
END CATCH
RETURN @ResultOpenExcel
END
「Where句」を渡す必要があります。コンテンツがある場合とない場合があります。たとえば、次のようになります。年齢> '23 '。手順をテストしていますが、次のエラーが発生します。
Incorrect syntax near 23
クエリのopenrowset部分の何が問題になっていますか?
@Print部分は、私の例ではこれを示しています:
"SELECT * ,'SMR1' AS ExcelName ,'Oct 6 2018 4:07PM' AS TimeStamp
INTO #TTT
from openrowset('Microsoft.ACE.OLEDB.12.0','Excel 8.0;Database=C:\NewExcelFile\SMR1.xlsx;hdr=yes',
'select * from [Sheet1$]where Age >'23' );"
私のクエリは正しいようですが、ここで何が問題になっていますか?
私は自分の問題を次のようにコードを書き換えることで解決しました:
DECLARE @date DATETIME
SET @date = getdate()
DECLARE @SQL NVARCHAR(MAX) = ' SELECT * ,' + QUOTENAME(@ExcelName, '''') + ' AS ExcelName ,' + QUOTENAME(@date, '''') + ' AS TimeStamp
INTO #TTT
from openrowset(''' + @Provider + ''',''Excel 8.0;Database=' + @FileName + ';hdr=' + @Header + '' + ''',
''select * from [' + @SheetName + '$]'')' + @WhereClause + ';
insert into ' + @TableName + '
select *
from #TTT
drop Table #TTT'
PRINT @SQL
EXEC (@SQL)