web-dev-qa-db-ja.com

OPENROWSETで変数として「Where句」を使用する

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' );"

私のクエリは正しいようですが、ここで何が問題になっていますか?

1
user157749

私は自分の問題を次のようにコードを書き換えることで解決しました:

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)
1
user157749