将SQL Server中的XML导出为文本文件以及将XML结果导出为XML

时间:2016-03-05 17:37:06

标签: sql xml integration

我有一个XML结果集,我需要将其导出为文本文件。这是一个由Web服务提取的控制文件。

我已阅读各种帖子,并且无法在SQL Server中将TEXT转换为XML是我能找到的最接近我想要实现的内容的帖子。

请记住,我对SQL很新。所以用盐很容易。你这些好人可以是残酷的!

我只知道可以做到这一点,这将为我节省大量时间来集成两个系统。我想知道如何将这些结果放到XML和文本文件中。

这是我的代码。

USE [Development]
GO
/****** Object:  StoredProcedure [dbo].      [INTEGRATION_MASTER_TABLE_XML_CONTROL_FILE]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[INTEGRATION_MASTER_TABLE_XML_CONTROL_FILE]
AS
declare
@xml nvarchar(max),
@ControlVars nvarchar(max)
set @xml =
N'<?xml version="1.0" encoding="UTF-8" ?>'
+ N'' + CHAR(10);
select  @ControlVars =
CONVERT(nvarchar(max),
(
(select
'<Import id="'+ IMPORT_ID +'" ',
'company="'+ COMPANY_ID +'" ',
'userName="'+ USER_NAME +'" ',
'description="'+ DESCRIPTION +'" ',
'writeLogFile="'+ WRITE_LOG_FILE +'" ',
'fileName="'+ FILE_NAME +'" ',
'errorToEmailAddress="'+ ERROR_TO_EMAIL_ADDRESS +'" '
from TABLE_CONTROL_FILE
where 1=1
FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')))
set @xml = @xml + @ControlVars +'/>'
select @xml;

谢谢你! 彭涅

我不明白你对输入的要求,因为我只是从我的表中提取值。当我执行SP时,输出将此xml返回到一列。

我想执行sp并将这些结果作为.txt文件保存到文件位置。我还想执行sp并将这些结果作为.xml文件保存到文件位置。 谢谢。 P

谢谢Kamran。我不知道用什么来提取文件。我从一份工作开始,这对我不起作用。有很多选择。也许如果我解释业务需求,你可以帮助我确定最好的途径。

我需要每15分钟自动运行一次SP(我假设我的预定作业是我需要的)并将结果作为.txt文件和.xml文件丢弃到服务器上的目录中一个Web服务。

感谢。 彭涅

更多内容。我测试了xp_cmdshell并收到以下错误。

Msg 15281,Level 16,State 1,Procedure xp_cmdshell,Line 1 SQL Server阻止访问组件“xp_cmdshell”的过程“sys.xp_cmdshell”,因为此组件已作为此服务器的安全配置的一部分关闭。系统管理员可以使用sp_configure启用“xp_cmdshell”。

显然这对我来说不是一个选择。我可以提出这个案例,但是在我这样做之前,还有另外一种方法吗?

如果启用了与xp_cmdshell相关的安全风险,我相当确定我的管理员不会启用它。必须有另一种方式。

彭涅

我一直在努力了解这一点。我在本地SQL Server上启用了xp_cmdshell。

我现在得到了这个结果。

Output Screen 这是我的代码。

USE [Development_Local]
GO
/****** Object: StoredProcedure [dbo].[MASTER_TABLE_XML_CONTROL_FILE_2]         
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[MASTER_TABLE_XML_CONTROL_FILE_2]
AS
declare

@xml nvarchar(max),
@ControlVars nvarchar(max)

set @xml =
N'<?xml version="1.0" encoding="UTF-16" ?>'
+ N'' + CHAR(10);

select @ControlVars =
CONVERT(nvarchar(max),
(
(select
'<Import id="'+ IMPORT_ID +'" ',
'company="'+ COMPANY_ID +'" ',
'userName="'+ USER_NAME +'" ',
'description="'+ DESCRIPTION +'" ',
'writeLogFile="'+ WRITE_LOG_FILE +'" ',
'fileName="'+ FILE_NAME +'" ',
'errorToEmailAddress="'+ ERROR_TO_EMAIL_ADDRESS +'" '

from MASTER_TABLE_XML_CONTROL_FILE
where 1=1

FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')))

set @xml = @xml + @ControlVars +'/>'

select @xml;
CREATE TABLE MyXMLTable
(
xCol XML
) ;

INSERT INTO MyXMLTable ( xCol )
SELECT
@xml

DECLARE @Command VARCHAR(255)
DECLARE @Filename VARCHAR(100)

SELECT @Filename = 'C:\Client XML\Test.xml'
SELECT @Command = 'bcp "select xCol from ' + DB_NAME()
+ '..MyXMLTable" queryout '
+ @Filename + ' -w -T -S' + @@servername
EXECUTE master..xp_cmdshell @command

SELECT CONVERT(nVARCHAR(max),BulkColumn)
FROM OPENROWSET(BULK 'C:\Client XML\Test.xml', SINGLE_BLOB) AS x
DROP TABLE MyXMLTable

好吧我明白了。显然我不能在DIR中输出空格。天啊。

我仍然有兴趣知道是否有另一种方法来做这个没有xp_cmdshell。我真的怀疑我的管理员会为我启用此功能。这似乎是一种安全隐患。

0 个答案:

没有答案