excelsql-server-2014data-dump

Exporting stored procedure result to excel


Similar Question may have been asked on this forum regarding exporting stored procedure result to excel file,I've tried few attempts to this but the file does not export to the folder that I expect,Your help is appreciated

Stored Procedure that I created

/****** Object:  StoredProcedure [dbo].[Copy_DataDump_SpecificQuery]    Script Date: 10/28/2014 15:59:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROC [dbo].[Copy_DataDump_SpecificQuery]
@SQLScript VARCHAR(MAX)
,@OutPut_Number INT OUTPUT
,@Output_FIleName VARCHAR(MAX) OUTPUT

AS
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN   

BEGIN TRY
DECLARE @server Varchar (100)
SET @server = 'MyServerName'
DECLARE @FileName VARCHAR(255)
DECLARE @Date VARCHAR(12)
SELECT @Date = CONVERT(VARCHAR(10),GETDATE(),120)
SET @Output_FIleName = CAST(NEWID() AS VARCHAR(MAX))+ '.xls'


DECLARE @FilePath VARCHAR (4000)
SET @FilePath = '\\ComputerName\Users\MyUserName\Downloads\Exel_File' + @Output_FIleName  ;

IF OBJECT_ID('tempDB..##temp_Query', 'U') IS NOT NULL
    DROP TABLE ##temp_Query;

----------------------------------------------------------------------------------------------
    DECLARE @Query  AS VARCHAR(MAX)
    DECLARE @FROM_Start INT

    SELECT @FROM_Start = CHARINDEX(' FROM ',@SQLScript)

    SELECT @Query = SUBSTRING(@SQLScript,0,@FROM_Start) + ' INTO ##temp_Query FROM ' + SUBSTRING(@SQLScript,@FROM_Start+6,LEN(@SQLScript))
PRINT (@Query)
    Exec(@Query)    
    ------------------------------------------------------------------------------------------------------------------
    DECLARE @dbName VARCHAR (100)
    SET @dbName = 'master'
    DECLARE @sql VARCHAR (5000)

    SET @sql = 'Select * from tempdb.dbo.##temp_Query'

    DECLARE @dbName1 VARCHAR (100)
    IF OBJECT_ID ('tempDB..##TempExport_Query1','U') is not null
    DROP TABLE ##TempExport_Query1
    IF OBJECT_ID ('tempDB..##TempExport_Query2','U') is not null
    DROP TABLE ##TempExport_Query2

    SELECT  @dbName1 = @dbName
    SELECT  @dbName = 'use ' + @dbName + ';'

    DECLARE @columnNames VARCHAR (8000), @columnConvert VARCHAR (8000), @tempSQL VARCHAR (8000)
    SELECT
        @tempSQL = LEFT(@sql, CHARINDEX('from', @sql) - 1) + ' into ##TempExport_Query1 ' +

        SUBSTRING(@sql, CHARINDEX('from', @sql) - 1, LEN(@sql))
    EXEC (@dbName + @tempSQL)

    --SELECT    *
    --FROM tempdb.INFORMATION_SCHEMA.Columns
    --WHERE table_name = '##TempExport_Query1'

    SELECT  @columnNames = COALESCE(@columnNames + ',', '') + '"' + column_name + '"',
        @columnConvert = COALESCE(@columnConvert + ',', '') + 'convert(nvarchar(4000),'
        + '[' + column_name + ']' + CASE
            WHEN data_type IN ('datetime', 'smalldatetime') THEN ',121'
            WHEN data_type IN ('numeric', 'decimal') THEN ',128'
            WHEN data_type IN ('float', 'real', 'money', 'smallmoney') THEN ',2'
            WHEN data_type IN ('datetime', 'smalldatetime') THEN ',120' ELSE ''
        END + ') as ' + '[' + column_name + ']'
    FROM tempdb.INFORMATION_SCHEMA.Columns
    WHERE table_name = '##TempExport_Query1'

-- execute select query to insert data and column names into new temp table        
    SELECT  @sql = 'select ' + @columnNames + 'temp##SortID  into ##TempExport_Query2 from (select ' + @columnConvert + ', 
        ''2'' as temp##SortID         
           from ##TempExport_Query1 union all select ''' + REPLACE(@columnNames, ',', ''', ''') + ''', 
               ''1'') t '        
    EXEC (@sql)

    SET @sql = 'bcp " select * from ##TempExport_Query2  ORDER BY temp##SortID " queryout "' + @FilePath +
    '" -U uno -P uno   -c -T -S ' + @server   

    EXEC master..xp_cmdshell @sql
SET @OutPut_Number = 1

END TRY
BEGIN CATCH
--DECLARE @ErrorDescription VARCHAR(1000) = 'ERROR - ' + ERROR_MESSAGE()
--      RAISERROR(@ErrorDescription,16,1)
    SET @OutPut_Number = 2
    --SET @OutPut_Message = @@ERROR
END CATCH


End

Parameters

DECLARE @OutPut_Number INT;
DECLARE @OutPut_Message VARCHAR(1000);
EXECUTE dbo.Copy_DataDump_SpecificQuery 'SELECT O.ID AS SystemNumber
        ,'' AS ManualNumber
        ,O.Date AS InvoiceDate
        ,OT.ID AS CustomerCode
        ,OT.Name AS CustomerName
        ,I.ID AS ItemID
        ,I.Description AS Item
        ,OL.UnitQty
        ,OL.FreeQty
        ,OL.UnitPrice
        ,OL.GrossValue
        ,NetSaleValue
        ,DueDate = ''
        ,A.ID AS SalesRepCode
        ,ItemCostPrice = OL.UnitPrice
    FROM TxnOrder O
        INNER JOIN TxnOrderLine OL ON O.UID = OL.TxnOrderUID AND O.SiteUID = Ol.TxnOrder_SiteUID
        INNER JOIN Outlet OT ON O.OutletUID = OT.UID
        INNER JOIN Item I ON OL.ItemUID = I.UID
        INNER JOIN Agent A ON O.AgentUID = A.UID
    WHERE O.mpt_TypeEnum = 1
        AND( O.IsPrinted = 1 OR O.mpt_SalesmodelEnum = 2)
        --AND O.Date >= @StartDate AND O.Date <= @EndDate
        --AND (@DistributorUID IS NULL OR O.DistributorUID = @DistributorUID)
        --AND (@AgentUID IS NULL OR O.AgentUID = @AgentUID)'
,@OutPut_Number OUTPUT
,@OutPut_Message OUTPUT
SELECT @OutPut_Message 

After I execute I receive the following Output on the SQL Output window

69111E97-BEDE-4BDE-9EBE-C063DB690E9F.xls

I have created the permission for the folder as per below screenshot

Folder

enter image description here


Solution

  • This Problem was resolved ,I Logged in to the server via RDP and I executed the SP as per below and it worked out..

    DECLARE @OutPut_Number INT;
    DECLARE @OutPut_Message VARCHAR(1000);
    EXECUTE dbo.Copy_DataDump_SpecificQuery 'SELECT O.ID AS SystemNumber
            ,O.Date AS InvoiceDate
            ,OT.ID AS CustomerCode
            ,OT.Name AS CustomerName
            ,I.ID AS ItemID
            ,I.Description AS Item
            ,OL.UnitQty
            ,OL.FreeQty
            ,OL.UnitPrice
            ,OL.GrossValue
            ,NetSaleValue
            ,A.ID AS SalesRepCode
            ,ItemCostPrice = OL.UnitPrice
        FROM TxnOrder O
            INNER JOIN TxnOrderLine OL ON O.UID = OL.TxnOrderUID AND O.SiteUID = Ol.TxnOrder_SiteUID
            INNER JOIN Outlet OT ON O.OutletUID = OT.UID
            INNER JOIN Item I ON OL.ItemUID = I.UID
            INNER JOIN Agent A ON O.AgentUID = A.UID
        WHERE O.mpt_TypeEnum = 1
            AND( O.IsPrinted = 1 OR O.mpt_SalesmodelEnum = 2)'
    ,@OutPut_Number OUTPUT
    ,@OutPut_Message OUTPUT
    SELECT @OutPut_Message 
    

    AND In My select Query I removed the Following Columns

    '' AS ManualNumber
       DueDate = ''
    

    AND as Im already have the permission to access the server via RDP,I replaced the following path as follows

    SET @FilePath = '\\ComputerName\Users\MyUserName\Downloads\Exel_File' + @Output_FIleName 
    

    C:\Users\Pathuma\Downloads\Excel SET @FilePath = '\C:\Users\MyUsername\Downloads\Excel' + @Output_FIleName