我有一个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。我真的怀疑我的管理员会为我启用此功能。这似乎是一种安全隐患。