Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS Access VBA-从存储过程输出下载XML文件_Xml_Ms Access_Stored Procedures_Vba - Fatal编程技术网

MS Access VBA-从存储过程输出下载XML文件

MS Access VBA-从存储过程输出下载XML文件,xml,ms-access,stored-procedures,vba,Xml,Ms Access,Stored Procedures,Vba,我需要一个从存储过程下载XML文件并将其保存到磁盘的函数。使用MS Access VBA是否可以实现这一点 以下是我在SQL Server中的测试示例: CREATE TABLE [dbo].[TestXML]( [ID] [int] NOT NULL, [PID] [int] NULL, [Code] [int] NULL, [Col1] [int] NULL, [Col2] [int] NULL, [Col3] [decimal](6, 2) NULL, [Col4] [decimal](6

我需要一个从存储过程下载XML文件并将其保存到磁盘的函数。使用MS Access VBA是否可以实现这一点

以下是我在SQL Server中的测试示例:

CREATE TABLE [dbo].[TestXML](
[ID] [int] NOT NULL,
[PID] [int] NULL,
[Code] [int] NULL,
[Col1] [int] NULL,
[Col2] [int] NULL,
[Col3] [decimal](6, 2) NULL,
[Col4] [decimal](6, 2) NULL,
[Col5] [int] NULL,
CONSTRAINT [PK_TestXML] PRIMARY KEY CLUSTERED ([ID] ASC)
)

GO
INSERT [dbo].[TestXML] ([ID], [PID], [Code], [Col1], [Col2], [Col3], [Col4], [Col5]) VALUES (1, 1000, 10, 1, 2, CAST(0.20 AS Decimal(6, 2)), CAST(0.10 AS Decimal(6, 2)), 1)
INSERT [dbo].[TestXML] ([ID], [PID], [Code], [Col1], [Col2], [Col3], [Col4], [Col5]) VALUES (2, 1000, 20, NULL, 1, CAST(1.00 AS Decimal(6, 2)), CAST(1.00 AS Decimal(6, 2)), 1)
INSERT [dbo].[TestXML] ([ID], [PID], [Code], [Col1], [Col2], [Col3], [Col4], [Col5]) VALUES (3, 1000, 30, NULL, NULL, CAST(2.00 AS Decimal(6, 2)), CAST(2.00 AS Decimal(6, 2)), 5)
GO
狂欢

VBA(我尝试过做什么,但不知道如何使用XML变量)


任何形式的帮助都将不胜感激,谢谢

您真的必须使用T-SQL返回参数吗

通常,如果编写“其他”T-SQL例程并希望返回值,则存储过程的返回参数是最好的

对于一般代码,为什么不执行select并以表的形式返回值,就像大多数情况下那样进行选择

所以代替

Select @MyXml = (blab la bla)
走吧

select (blab la bla).
或者在最后,简单地将@MyXml声明为var,然后

Select @MyXml
如果采用上述方法,则存储过程将变为:

CREATE PROCEDURE returnXML 
    (@ID INT)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT (SELECT PID [p/@v],(
    SELECT Code as [code/@c], Col1 AS [code/val]
    FROM [dbo].[TestXML]
    WHERE ID=@ID
    FOR XML PATH(''),TYPE)
FROM [dbo].[TestXML]
WHERE ID=@ID
FOR XML PATH('u'),TYPE)
END
GO
在Access中,如果您声明了一个传递查询(您应该有一个“通用”查询),那么您可以:

Sub Test1()

   Dim i        As Integer
   Dim strXML   As String

   i = InputBox("What id")
       With CurrentDb.QueryDefs("qryPassR")
      .SQL = "returnXML " & i
      strXML = .OpenRecordset()(0)
   End With

   Debug.Print strXML
在Access中使用pt查询意味着您不会弄乱代码中的连接字符串

因此,除非存在某种“大”理由来使用该返回参数,否则您可以使用上述方法。如果您确实必须使用一些“现有”的t-sql例程来返回值,那么我建议使用exec+a select@MyXml

因此,即使您被迫使用返回值,您也可以在上面的.SQL=中执行以下操作:

declare @MyXML varcharmx
Myxml 1,@Mxml;select @myxml

应该是可能的。您卡在哪里了?用于xml参数类型的开始。我尝试的(adVarBinary,adLongVarChar)出现以下错误“参数对象定义不正确。提供的信息不一致或不完整”我想在这里了解关于JSON和access解析的广泛讨论。如果您感兴趣,可以看看我的,它可以将查询/表导出为JSON字符串。谢谢您的回答。将选择返回为字符串的问题是我丢失了所需的XML格式,这就是我想到返回XM的原因L variable.Hum,我认为xml是一个返回的字符串-不知道为什么会有不同。唯一的问题可能是xml长度超过255,但除此之外,返回的字符串应该保留xml格式。大于255,但你是对的,如果小于255,则保留格式。
Sub Test1()

   Dim i        As Integer
   Dim strXML   As String

   i = InputBox("What id")
       With CurrentDb.QueryDefs("qryPassR")
      .SQL = "returnXML " & i
      strXML = .OpenRecordset()(0)
   End With

   Debug.Print strXML
declare @MyXML varcharmx
Myxml 1,@Mxml;select @myxml