我一直在寻找解决问题的解决方案。
我有一个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方面是新手。
答案 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#控制台应用程序为您执行此操作,然后将其插入任务计划程序?
控制台应用程序将运行查询并获取结果,然后将其写入已配置的文件位置。