将SQL查询结果保存到不带SSIS或xp_cmdshell的XML文件

时间:2013-11-05 12:24:45

标签: sql-server-2008

我一直在寻找解决问题的解决方案。

我有一个SQL服务器查询,它在XML中生成我需要的一些输出,所以这是查询:

SELECT FinishCode, reason, COUNT(reason) as Numbers
  FROM [I3_Dialer].[dbo].[I3_UKPIPELINEWORKFLOW_CH0]
 WHERE callplacedtime > (select cast(convert(varchar(10), getdate(), 110) as datetime)) and reason = 'Success'
 GROUP BY reason, finishcode
 ORDER BY Numbers
 FOR XML PATH('FinishCode'), ROOT('UK_Products_Pipeline'); 

该输出生成XML,但我需要将其存储为文件并每隔xx分钟作为作业运行。

我找到的所有解决方案都使用了带有xp_cmdshell或SSIS的BCP。我发现SQL服务器上唯一可用的是BCP(令我惊讶),服务器没有足够的资源来安装SSIS,SQL管理员也不想启用或安装其他软件。

我试图用这个来运行一个Job,但是它生成的文件包含了许多混乱XML的附加信息。

欢迎任何建议,因为我在SQL方面是新手。

2 个答案:

答案 0 :(得分:3)

经过长时间的挖掘,我找到了解决问题的方法:

我创建了一个这样的存储过程:

USE [DATABASE NAME]
GO
/****** Object:  StoredProcedure [dbo].[asp_Write_String_To_File]    Script Date:   11/21/2013 09:33:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [PROCEDUER NAME] 
  (
    @String Varchar(max), --8000 in SQL Server 2000
    @Path VARCHAR(255),
    @Filename VARCHAR(100)
  )

AS
DECLARE  @objFileSystem int,
         @objTextStream int,
         @objErrorObject int,
         @strErrorMessage Varchar(1000),
         @Command varchar(1000),
         @hr int,
         @fileAndPath varchar(80)

set nocount on

select @strErrorMessage='opening the File System Object'
EXECUTE @hr = sp_OACreate  'Scripting.FileSystemObject' , @objFileSystem OUT

Select @FileAndPath=@path+'\'+@filename
    if @HR=0 Select @objErrorObject=@objFileSystem , @strErrorMessage='Creating file "'+@FileAndPath+'"'
    if @HR=0 execute @hr = sp_OAMethod   @objFileSystem   , 'CreateTextFile' , @objTextStream OUT, @FileAndPath,2,True

    if @HR=0 Select @objErrorObject=@objTextStream, @strErrorMessage='writing to the file "'+@FileAndPath+'"'
    if @HR=0 execute @hr = sp_OAMethod  @objTextStream, 'Write', Null, @String

    if @HR=0 Select @objErrorObject=@objTextStream, @strErrorMessage='closing the file "'+@FileAndPath+'"'
    if @HR=0 execute @hr = sp_OAMethod  @objTextStream, 'Close'

    if @hr<>0
    begin
    Declare 
        @Source varchar(255),
        @Description Varchar(255),
        @Helpfile Varchar(255),
        @HelpID int

        EXECUTE sp_OAGetErrorInfo  @objErrorObject, @source output,@Description output,@Helpfile output,@HelpID output
        Select @strErrorMessage='Error whilst ' +coalesce(@strErrorMessage,'doing something') +', '+coalesce(@Description,'')
        raiserror (@strErrorMessage,16,1)
    end
EXECUTE  sp_OADestroy @objTextStream
EXECUTE sp_OADestroy @objTextStream

然后在查询中我调用存储过程如下:

USE [DATABASE NAME]
declare @xml nvarchar(max)
declare @FilePath nvarchar(255)
declare @FileName nvarchar(255)
set @FilePath = '[Path to store file]'       -- Location to store the file
set @FileName = '[File Name to store].xml'   -- This is the XML filename

BEGIN
  set @xml =
      (
        SELECT ( -- Add This
               SELECT FinishCode, Reason, COUNT(*) AS Numbers
                 FROM [DATABASE] ch WITH (NOLOCK)
                WHERE [Condition 1]
                  AND [Condition 2]
        GROUP BY Reason, FinishCode
                ORDER BY Numbers
              FOR XML PATH('FinishCode'),
                 ROOT('UK_Products_Pipeline'),
                 TYPE
                ) -- Add This
         FOR XML PATH('Dial_Stats') -- Add This
   )

exec asp_Write_String_To_File @xml, @FilePath, @FileName

END

然后调用存储过程并将文件写入

答案 1 :(得分:0)

您可以尝试编写一个快速的c#控制台应用程序为您执行此操作,然后将其插入任务计划程序?

控制台应用程序将运行查询并获取结果,然后将其写入已配置的文件位置。